全志H616 通过Cedrus和v4l2_request API实现硬件编解码加速(香橙派zero2)

news2024/12/23 14:49:16

编译安装或加载cedrus驱动模块,加载v4l2-mem2mem

Sunxi-Cedrus 致力于为全志 SoC 提供硬件加速的视频解码和编码支持,并将其引入主线 Linux 内核。此外,还为典型的基于 GNU/Linux 的系统提供了与内核驱动程序接口的其他用户空间组件。

Sunxi-Cedrus - linux-sunxi.org

如果你的kernel中不包含sunxi-cedrus驱动、v4l2-mem2mem,可能要从源码开始编译该模块。

对于香橙派zero2,sunxi-cedrus视频编解码驱动存在于 Linux 内核源码drivers/staging/media/sunxi/cedrus目录,而v4l2相关支持在drivers/media/v4l2-core/中,通过编译orangepi提供的源码我们可以知道,sunxi-cedrus已被编译为模块但并未加载,需要我们手动加载。

sudo modprobe sunxi-cedrus
sudo modprobe v4l2_mem2mem

lsmod | grep cedrus
dmesg | grep cedrus
lsmod | grep v4l2_mem2mem

echo "sunxi-cedrus" | sudo tee -a /etc/modules #系统在启动时自动加载 sunxi-cedrus 模块

我们可以观察到,cedrus已在系统中成功注册,并注册为/dev/video0,并提醒驱动来自于 Linux 内核的“staging”目录,这意味着该模块可能还不完全稳定或经过充分测试。

请添加图片描述

对 Sunxi-Cedrus 的支持是通过内核空间或用户空间中的各种组件实现的:

  • Cedrus V4L2 M2M 内核驱动程序
  • v4l2 请求 VAAPI 后端

此外,还提供了其他用户空间组件,用于开发目的:

  • v4l2-request-test 工具,允许测试 -Cedrus VPU 驱动程序
  • libdrm-sun4i,支持以 VPU 使用的 MB32 平铺 NV12 格式分配缓冲区**(已弃用)**
  • libva-dump VAAPI,允许从视频中转储元数据和切片

支持 libVA 的视频播放器应与 v4l2-request libVA 后端兼容。但是,实现中的某些细节可能会导致与某些播放器不兼容。

下表显示了 v4l2-request libVA 后端中特定编解码器的支持状态:

请添加图片描述

下表显示了对 V4L2 M2M 内核驱动程序中特定 SoC 的支持:

请添加图片描述

以下播放器使用 v4l2-request libVA 后端进行了测试:

请添加图片描述

采用Gstreamer工具进行硬件编解码的测试

安装Gstreamer和相关插件,加载必要模块

sudo apt update
sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
sudo apt install v4l-utils
gst-launch-1.0 --version

sudo modprobe videobuf2-core
sudo modprobe videobuf2-memops
sudo modprobe videobuf2-vmalloc
sudo modprobe videobuf2-v4l2
sudo modprobe v4l2-mem2mem
sudo modprobe sunxi-cedrus

查看H.264相关的编解码支持

gst-inspect-1.0 | grep 264

root@orangepizero2:~# gst-inspect-1.0 | grep 264
libav:  avdec_h264: libav H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 decoder
libav:  avenc_h264_omx: libav OpenMAX IL H.264 video encoder encoder
libav:  avmux_ipod: libav iPod H.264 MP4 (MPEG-4 Part 14) muxer
openh264:  openh264dec: OpenH264 video decoder
openh264:  openh264enc: OpenH264 video encoder
rtp:  rtph264depay: RTP H264 depayloader
rtp:  rtph264pay: RTP H264 payloader
typefindfunctions: video/x-h264: h264, x264, 264
uvch264:  uvch264deviceprovider (GstDeviceProviderFactory)
uvch264:  uvch264mjpgdemux: UVC H264 MJPG Demuxer
uvch264:  uvch264src: UVC H264 Source
v4l2codecs:  v4l2slh264dec: V4L2 Stateless H.264 Video Decoder  
# v4l2slh264dec这是一个 V4L2 Stateless H.264 Video Decoder,用于硬件加速解码。
videoparsersbad:  h264parse: H.264 parser
x264:  x264enc: x264 H.264 Encoder

那么,可以先用本地mp4视频测试硬件解码,并将解码数据直接保存保存为原始 YUV 格式文件(例如 NV12 或 I420),我们可以看到v4l2-ctl显示了香橙派的/dev/video0设备支持的视频捕获格式

root@orangepizero2:~# v4l2-ctl --list-formats-ext -d /dev/video0
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'ST12' (Y/UV 4:2:0 (32x32 Linear))
        [1]: 'NV12' (Y/UV 4:2:0)

利用Gstreamer解码本地命令

gst-launch-1.0 -v filesrc location=input.mp4 ! qtdemux ! h264parse ! v4l2slh264dec ! videoconvert ! video/x-raw,format=I420 ! filesink location=output.yuv

出现报错,从dmesg日志中可以看出,cedrus 视频编解码器在尝试分配 DMA 内存时失败了。这通常表示系统内存不足或者 DMA 分配失败。解码 H.264/H.265 视频可能需要大量的 CMA 内存,因此建议设置一个大型 CMA 池,例如使用内核命令行参数。例如,256 MiB 应该足以解码 1080p H.264 视频。

/boot/orangepiEnv.txt中添加或修改如下行:

extraargs=cma=256M

接下来,我们尝试编码推流,但是我们发现Gstreamer工具中v4l2并没有适用硬件加速编码的支持。

先尝试软件编码推流,安装RTSP服务

sudo apt-get install gir1.2-gst-rtsp-server-1.0 libgstrtspserver-1.0-0 libgstrtspserver-1.0-dev

编写服务器推流代码,命名为 rtsp-server.c

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>

int main(int argc, char *argv[]) {
  gst_init(&argc, &argv);

  GstRTSPServer *server = gst_rtsp_server_new();
  gst_rtsp_server_set_service(server, "8554");

  GstRTSPMountPoints *mounts = gst_rtsp_server_get_mount_points(server);
  GstRTSPMediaFactory *factory = gst_rtsp_media_factory_new();

  // 使用v4l2src从摄像头采集视频,并使用x264enc进行编码
  gst_rtsp_media_factory_set_launch(factory,
    "( v4l2src device=/dev/video1 ! video/x-raw,width=640,height=480 ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency profile=main ! rtph264pay name=pay0 pt=96 )");

  gst_rtsp_mount_points_add_factory(mounts, "/test", factory);

  g_object_unref(mounts);

  gst_rtsp_server_attach(server, NULL);

  g_print("stream ready at rtsp://192.168.137.189:8554/test\n");
  GMainLoop *loop = g_main_loop_new(NULL, FALSE);
  g_main_loop_run(loop);

  gst_object_unref(server);
  g_main_loop_unref(loop);

  return 0;
}

使用GCC编译器编译代码,链接GStreamer库。

gcc rtsp-server.c -o rtsp-server `pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0`
./rtsp-server

这样就会启动RTSP服务器,并开始推流。你可以使用VLC或其他支持RTSP的媒体播放器来访问和观看流媒体。例如,在VLC中打开网络串流,输入RTSP流地址(比如 rtsp://192.168.137.189:8554/test),就可以观看视频流了。延时大概2秒左右,cpu占用率80%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java使用Hutool工具类轻松生成验证码

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、效果展示1.1 扭曲干扰的验证码1.…

C++学习第十一天——vector的模拟实现

✨ 生于火焰&#xff0c;落俗不可避免&#xff0c;但浪漫至死不渝 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

白玉兰之争王一博vs王阳谁将摘得男主荣耀

白玉兰之争&#xff1a;王一博VS王阳&#xff0c;谁将摘得男主荣耀&#xff1f;在这个星光璀璨的夜晚&#xff0c;白玉兰奖的提名名单犹如一道耀眼的闪电&#xff0c;点燃了娱乐圈的硝烟。其中&#xff0c;王一博与王阳入围白玉兰男主角的消息更是引发了热议狂潮。两位实力派演…

使用pytorch构建ResNet50模型训练猫狗数据集

数据集 1.导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, models import numpy as np import matplotlib.pyplot as plt import os from tqdm.auto import t…

iOS ------ 多线程 GCD

一&#xff0c;GCD简介 GCD是Apple开发的一个多线程的较新的解决方案。它主要用于优化应用程序以支持多核处理器以及其他对称处理系统。它是一个在线程池模式的基础上执行的并发任务。 为什么要使用GCD&#xff1f; GCD&#xff01;可用于多核的并行运算GCD会自动利用更多的…

dockers安装mysql

1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址&#xff1a;https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例&#xff0c;并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…

模拟 CMOS 逆变器的开关功耗

我们不会进一步讨论静态功耗。相反&#xff0c;本文和下一篇文章将介绍 SPICE 仿真&#xff0c;以帮助您更全面地了解逆变器的不同类型的动态功耗。本文重点讨论开关功率——输出电压变化时电容充电和放电所消耗的功率。 LTspice 逆变器实施 图 1 显示了我们将使用的基本 LTsp…

小白跟做江科大32单片机之OLED驱动

原理部分 代码测试 1.江科大老师提供的以下代码文件放入工程中&#xff0c;进行测试 2.正常显示即可

一点连接千家银行,YonSuite让“企业资金”实时在线

用友YonSuite作为全场景SaaS应用服务&#xff0c;是成长型企业实现数智转型的不二选择。多年来&#xff0c;凭借不断的技术革新&#xff0c;通过与千家银行的一站式连接&#xff0c;实现了企业资金的实时在线管理&#xff0c;为成长型企业带来了极大的便利和效益。这一举措不仅…

618适合入手哪些数码好物?实用数码好物清单分享,错过拍烂大腿!

在一年一度的618购物狂欢节里&#xff0c;许多数码爱好者们都在这次盛大的购物盛宴中觅得心仪的数码好物&#xff0c;数码产品不仅改变了我们的生活方式&#xff0c;更让我们享受到了前所未有的便捷和乐趣&#xff0c;那么在这个618&#xff0c;哪些数码好物值得我们入手呢&…

在线IP检测如何做?代理IP需要检查什么?

当我们的数字足迹无处不在&#xff0c;隐私保护显得愈发重要。而代理IP就像是我们的隐身斗篷&#xff0c;让我们在各项网络业务中更加顺畅。 我们常常看到别人购买了代理IP服务后&#xff0c;通在线检测网站检查IP&#xff0c;相当于一个”售前检验““售后质检”的作用。但是…

Golang:使用Base64Captcha生成数字字母验证码实现安全校验

Base64Captcha可以在服务端生成验证码&#xff0c;以base64的格式返回 为了能看到生成的base64验证码图片&#xff0c;我们借助gin go get -u github.com/mojocn/base64Captcha go get -u github.com/gin-gonic/gin文档的示例看起来很复杂&#xff0c;下面&#xff0c;通过简…

豆包浏览器插件会造成code标签内容无法正常显示

启用状态&#xff1a;页面的代码会显示不正常 禁用后&#xff0c;正常显示 害得我重置浏览器设置&#xff0c;一个个测试

leetcode刷题记录28-427. 建立四叉树

问题描述 给你一个 n * n 矩阵 grid &#xff0c;矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。 你需要返回能表示矩阵 grid 的 四叉树 的根结点。 四叉树数据结构中&#xff0c;每个内部节点只有四个子节点。此外&#xff0c;每个节点都有两个属性&#xff1a; val…

JVM学习-字节码指令集(三)

代码下载 操作数栈管理指令 如同操作一个普通数据结构中的堆栈那样&#xff0c;JVM提供的操作数栈管理指令&#xff0c;可以用于直接操作数栈的指令 将一个或两个元素从栈顶弹出&#xff0c;并且直接废弃&#xff1a;pop,pop2复制栈顶一个或两个数值并将复制值成双份的复制值…

【全开源】餐饮点餐系统源码(ThinkPHP+FastAdmin+UniApp)

开启智能餐饮新时代的钥匙 基于ThinkPHPFastAdminUniApp开发的餐饮点餐系统&#xff0c;主要应用于餐饮&#xff0c;例如早餐、面馆、快餐、零食小吃等快捷扫码点餐需求&#xff0c;标准版本仅支持先付款后就餐模式&#xff0c;高级版本支持先付后就餐和先就餐后付费两种模式。…

昆虫记思维导图,超详细解读

《昆虫记》是法国杰出昆虫学家、文学家法布尔的传世佳作&#xff0c;它不仅是一部研究昆虫的科学巨著&#xff0c;同时也是一部脍炙人口的文学经典。在这部作品中&#xff0c;法布尔以其独特的视角和细腻的笔触&#xff0c;为我们揭示了一个神秘而精彩的昆虫世界。那么&#xf…

重生之 SpringBoot3 入门保姆级学习(11、日志的进阶使用)

重生之 SpringBoot3 入门保姆级学习&#xff08;11、日志的进阶使用&#xff09; 3.2.4 文件输出3.2.5 日志文档的归档与切割 3.2.4 文件输出 配置 application.properties # 日志文件名 如果不写路径默认就是在项目根路径建立 demo.log 文件 推荐写法 D:\\demo.log 路径 文…

为什么要使用动态代理IP?

一、什么是动态代理IP&#xff1f; 动态代理IP是指利用代理服务器来转发网络请求&#xff0c;并通过不断更新IP地址来保护访问者的原始IP&#xff0c;从而达到匿名访问、保护隐私和提高访问安全性的目的。动态代理IP在多个领域中都有广泛的应用&#xff0c;能够帮助用户…

面试题:计算机网络中的七四五是什么?

面试题&#xff1a;计算机网络中的七四五是什么&#xff1f; 计算机网络中说的七四五是指&#xff1a;OSI 七层模型、TCP/IP 四层模型、OSI 与 TCP/IP 的综合五层模型 OSI 七层模型 OSI 将计算机网络分为了七层&#xff0c;每一层抽象底层的内容&#xff0c;并遵守一定的规则…