Linux之gstreamer视频编解码测试指令

Posted 宗而研之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之gstreamer视频编解码测试指令相关的知识,希望对你有一定的参考价值。

0 背景

gstreamer 是一个流媒体处理框架,可以使用插件的方法创建 pipeline,快速验证某些功能。NVIDIA 推出的 deepstream 便是基于 gstreamer 开发的 sdk,也推出了自己的插件,如硬件编解码模块 NVCODEC。

在开发过程中,我们习惯用 gst-launch-1.0 工具来搭建 pipeline,因此本文整理一下常见的 pipeline 方法,并不断完善补充。

关于 gstreamer 的基本使用,可以参考《gstreamer基础教程》和《gstreamer开发手册》系列教程。

由于 NVIDIA 的 jetson 平台与 dGPU 平台的编解码模块有所区别,因此本文按照平台进行分类汇总。

参考:https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/accelerated_gstreamer.html

1 jetson 平台

1.1 工具

由于要在jetson上使用usb摄像头,需要安装 v4l-utils

 sudo apt-get install v4l-utils

要查询v4l设备(将它们连接到您的Jetson的USB端口后),请使用以下命令

 v4l2-ctl --list-devices

查询设备支持的格式(在这种情况下为video0)

 v4l2-ctl -d /dev/video0 --list-formats-ext

或者,您可以简单地查询所有已连接的v4l设备 

v4l2-ctl --list-formats-ext

1.2 读取视频并保存视频

gst-launch-1.0 videotestsrc ! \\
  'video/x-raw, format=(string)I420, width=(int)640, \\
  height=(int)480' ! omxh264enc ! \\
  'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! \\
  qtmux ! filesink location=test.mp4 -e

1.3 读取USB摄像头并保存视频

gst-launch-1.0 v4l2src device="/dev/video0" ! "video/x-raw, width=1920, height=1080" \\
  ! decodebin ! videoconvert ! omxh264enc ! video/x-h264, \\
  stream-format=byte-stream ! h264parse ! qtmux ! filesink \\
  location=test.mp4 -e

1.4 读取文件并显示

gst-launch-1.0 filesrc location=test.mp4 ! qtdemux name=demux ! h264parse ! \\
  omxh264dec ! fakesink -e

1.5 流式传输

编码发送

gst-launch-1.0 v4l2src ! decodebin ! videoconvert ! omxh264enc ! video/x-h264, \\
  stream-format=byte-stream ! rtph264pay pt=96 ! udpsink host=127.0.0.1 port=8001 sync=false -e

接收解码

gst-launch-1.0 udpsrc address=127.0.0.1 port=8001 ! application/x-rtp, encoding-name=H264, \\
  payload=96 ! rtph264depay ! queue ! h264parse ! omxh264dec ! fakesink

2 dGPU 平台

2.1 deepstream测试

gst-launch-1.0 filesrc location= /opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_1080p_h264.mp4 ! qtdemux ! \\
    h264parse ! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1920 height=1080 batched-push-timeout=4000000 ! \\
    nvinfer config-file-path= /opt/nvidia/deepstream/deepstream-5.0/samples/configs/deepstream-app/config_infer_primary.txt \\
    batch-size=1 unique-id=1 ! nvvideoconvert ! nvdsosd ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! fpsdisplaysink test-overlay=false \\
    video-sink="fakesink" -v

2.2 硬件编码

gst-launch-1.0 videotestsrc ! video/x-raw,width=1920,height=1080,format=BGR ! videoconvert ! video/x-raw,format=I420 ! nvvideoconvert ! 'video/x-raw(memory:NVMM)' ! nvv4l2h264enc ! h264parse ! matroskamux ! fakesink

2.3 硬件编码输出rtsp

gst-launch-1.0 videotestsrc ! videoconvert ! video/x-raw,format=I420,width=640,height=480 ! nvvideoconvert ! 'video/x-raw(memory:NVMM)' ! nvv4l2h264enc ! video/x-h264, stream-format=byte-stream ! rtspclientsink location=rtsp://127.0.0.1/live/test

2.4 软件编码输出rtsp

gst-launch-1.0 videotestsrc ! videoconvert ! video/x-raw,format=I420,width=640,height=480 ! x264enc  ! video/x-h264, stream-format=byte-stream ! rtspclientsink location=rtsp://127.0.0.1/live/test

(持续更新中)

以上是关于Linux之gstreamer视频编解码测试指令的主要内容,如果未能解决你的问题,请参考以下文章

RIoTBoard开发板系列笔记—— gstreamer + vpu实现视频硬件解码播放

使用 GStreamer 在 Android 上进行硬件视频解码

Raspberry Pi 上的 GStreamer 全高清视频 RTP 流

OpenHD改造实现廉价高清数字图传(树莓派+PC)—gstreamer视频采集传输和显示

gstreamer入门和概述

gstreamer入门和概述