在工程实践中,通常使用使用英伟达版板卡作为图像处理的控制器,常见的有xavier, TX2, orin,Nano等,这些控制器使用Gstreamer进行硬件编码的插件通常为omxh264enc, nvv4l2h264enc。本文将基于这两个插件进行介绍区别,并给出使用示例本。本系列其他文章有:
Gstreamer系列(1):linux平台下的gstreamer安装-CSDN博客
Gstreamer系列(2):gstreamer的视频编解码及不同平台编解码插件_gstreamer硬件编解码花屏-CSDN博客Gstreamer系列(3):ubuntu18.04, ubuntu20.04在x86平台Nvidia显卡的Gstreamer硬件编解码安装-CSDN博客
Gstreamer系列(4):Gstreamer在x86平台使用硬编码对视频进行保存mp4,推拉流-CSDN博客
omxh264enc 和 nvv4l2h264enc 都是 GStreamer 中用于 H.264 硬编码的插件,但它们针对不同的硬件平台和驱动架构。以下是它们的主要区别:
1. 硬件平台
- omxh264enc和omxh264dec
- 主要用于基于 ARM 架构的设备,如 NVIDIA Jetson 系列(如 Jetson TX1, TX2, Nano, Xavier)。
- 使用 OpenMAX IL (OMX) 接口进行硬件编码。
- nvv4l2h264enc和nvv4l2decoder
- 主要用于基于 NVIDIA GPU 较新的设备,如orin,或者之前Nvidia板卡系统更新后。
- 使用 V4L2 (Video for Linux 2) 接口进行硬件编码。
2. 驱动架构
- omxh264enc和omxh264dec
- 依赖于 OpenMAX IL (OMX) 驱动,这是一个跨平台的接口,用于与硬件加速器进行通信。
- OMX 接口在某些设备上可能已经被弃用或不再更新。
- nvv4l2h264enc和nvv4l2decoder
- 依赖于 V4L2 (Video for Linux 2) 驱动,这是一个更通用的接口,广泛用于 Linux 系统中的视频处理。
- V4L2 接口在 NVIDIA 设备上提供了更现代的硬件加速支持。
3. 性能和功能
- omxh264enc和omxh264dec
- 在某些旧的 NVIDIA Jetson 设备上可能性能较好,但在新的设备上可能不如 nvv4l2h264enc。
- 功能相对简单,支持的编码参数较少。
- nvv4l2h264enc和nvv4l2decoder
- 在新的 NVIDIA Jetson 设备上性能更好,支持更多的编码参数和高级功能。
- 提供了更多的控制选项,如比特率控制、GOP 大小、帧率等。
4. 兼容性
- omxh264enc和nvv4l2decoder
- 在某些旧的 NVIDIA Jetson 设备上可能更稳定,但在新的设备上可能不如 gst-v4l2 稳定。
- nvv4l2h264enc和nvv4l2decoder
- 在新的 NVIDIA Jetson 设备上更稳定,且兼容性更好。
5. 终端命令
5.1 gst-omx
# 采集摄像头播放
gst-launch-1.0 -ve v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! autovideosink
# omxh264enc 保存mp4
gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! omxh264enc ! h264parse ! qtmux ! filesink location=test.mp4 -e
# omx264enc rtp推流
gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! omxh264enc ! ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
# avdec_h264软解码拉流
gst-launch-1.0 udpsrc port=7777 buffer-size=60000000 caps="application/x-rtp,media=video, clock-rate=90000,payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
# omxh264dec拉流
gst-launch-1.0 udpsrc port=7777 buffer-size=60000000 caps="application/x-rtp,media=video, clock-rate=90000,payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! h264parse ! omxh264dec ! videoconvert ! autovideosink
5.2 gst-v4l2
# 采集摄像头播放
gst-launch-1.0 -ve v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! autovideosink
# nvv4l2h264enc 保存mp4
gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=test.mp4 -e
# nvv4l2h264enc rtp推流
gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! nvv4l2h264enc ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
# avdec_h264软解码拉流
gst-launch-1.0 udpsrc port=7777 buffer-size=60000000 caps="application/x-rtp,media=video, clock-rate=90000,payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
# nvv4l2decoder拉流
gst-launch-1.0 udpsrc port=7777 buffer-size=60000000 caps="application/x-rtp,media=video, clock-rate=90000,payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e
6. 总结
在工程实践中,NVIDIA Jetson 系列板卡(如 Xavier, TX2, Orin, Nano 等)常用于图像处理,GStreamer 提供了 omxh264enc
和 nvv4l2h264enc
两个硬件编码插件。omxh264enc
主要用于基于 ARM 架构的旧设备,使用 OpenMAX IL (OMX) 接口,性能较好但功能简单,支持的编码参数较少。nvv4l2h264enc
则用于较新的设备,使用 V4L2 接口,性能更优,支持更多编码参数和高级功能,如比特率控制、GOP 大小、帧率等。