前面的博客介绍了x86平台上使用Nvdia显卡的硬件编解码插件的安装,本文将介绍如何在x86 ubuntu + Nvdia显卡平台上使用gstreamer命令,本系列其他文章有:
Gstreamer系列(1):linux平台下的gstreamer安装
Gstreamer系列(2):gstreamer的视频编解码及不同平台编解码插件
Gstreamer系列(3):ubuntu18.04, ubuntu20.04在x86平台Nvidia显卡的Gstreamer硬件编解码安装
引言
将Gstremaer多媒体处理框架在正式进行代码开发前,一般都需要先进行终端指令的测试,用于确定使用哪些插件组合的能够达到目的、并且效率高,资源占用低。本文将介绍在x86平台上常用的gstreamer命令进行分享。
1. 测试视频
1.1 播放videotestsrc
# 测试视频显示
gst-launch-1.0 -v videotestsrc pattern=0 ! "video/x-raw,framerate=30/1,width=800,height=600" ! timeoverlay ! autovideosink
1.2 保存videotestsrc为mp4
# 软编码 x264enc
gst-launch-1.0 -v videotestsrc pattern=0 ! "video/x-raw,framerate=30/1,width=800,height=600" ! timeoverlay ! x264enc ! h264parse ! qtmux ! filesink location=test.mp4 -e
# 硬编码 nvh264enc
gst-launch-1.0 -v videotestsrc pattern=0 ! "video/x-raw,framerate=30/1,width=800,height=600" ! timeoverlay ! nvh264enc ! h264parse ! qtmux ! filesink location=test.mp4 -e
2. 摄像头视频
2.1 播放摄像头
# 播放摄像头视频显示
gst-launch-1.0 -ve v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! autovideosink
摄像头为HP 320 FHD WebCam,可以使用一下命令查看摄像头支持的格式、分辨率和帧率
# 查看摄像头支持的格式和分辨率
v4l2-ctl --device=/dev/video0 --list-formats-ext
2.2 保存mp4
# 软编码 x264enc
gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! x264enc ! h264parse ! qtmux ! filesink location=test.mp4 -e
# 硬编码 nvh264enc
gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! nvh264enc ! h264parse ! qtmux ! filesink location=test.mp4 -e
3. rtp推拉流
在实际应用中,在局域网中通常要将一个设备的视频推送到另一个设备中,在rtsp/rtmp/rtp等多种流媒体传输协议中,RTP是最简单的一种。在RTP视频传输中,音视频数据首先被分割为较小的数据包(RTP包),每个RTP包包含了音视频数据的一部分以及一些附加信息(如时间戳和序列号)。然后,这些RTP包通过UDP协议在网络上进行传输。接收端在收到RTP包后,根据时间戳和序列号对数据包进行排序和重组,从而实现音视频数据的同步和顺序播放。因为其使用UDP传输,广泛应用于各种需要实时音视频传输的场景。
3.1 推流
# x264enc 推测试流
gst-launch-1.0 -v videotestsrc pattern=0 ! "video/x-raw,framerate=30/1,width=640,height=480" ! timeoverlay ! x264enc bitrate=3000 rc-mode=2 ! rtph264pay ! udpsink host=127.0.0.1 port=1234
# nvh264 推测试流
gst-launch-1.0 -v videotestsrc pattern=0 ! "video/x-raw,framerate=30/1,width=640,height=480" ! timeoverlay ! nvh264enc bitrate=3000 ! rtph264pay ! udpsink host=127.0.0.1 port=1234
# x264enc 推摄像头视频流
gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! x264enc bitrate=3000 rc-mode=2 ! rtph264pay ! udpsink host=127.0.0.1 port=1234
# nvh264 推摄像头视频流
gst-launch-1.0 -v v4l2src device=/dev/video0 ! "video/x-raw, format=YUY2,width=640,height=480,framerate=30/1" ! videoconvert ! nvh264enc bitrate=3000 ! rtph264pay ! udpsink host=127.0.0.1 port=1234
3.2 拉流播放
# avdec_h264 软解码
gst-launch-1.0 udpsrc port=1234 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
# nvdec 硬解码 (适用于Ubuntu18.04 Ubuntu 20.4)
gst-launch-1.0 udpsrc port=1234 buffer-size=60000000 caps="application/x-rtp,media=video, clock-rate=90000,payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! h264parse ! nvdec ! gldownload ! videoconvert ! autovideosink
# nvh264dec 硬解码(适用于Ubuntu 22.04)
gst-launch-1.0 udpsrc port=1234 buffer-size=60000000 caps="application/x-rtp,media=video, clock-rate=90000,payload=96, encoding-name=H264" ! rtpjitterbuffer latency=7 ! rtph264depay ! h264parse ! nvh264dec ! videoconvert ! autovideosink
除了x86平台外,通常视频的处理和推拉流都在arm平台上处理,包括xavire,orin等平台。下篇文章将继续分享在arm平台上常见的一些使用Gstreamer命令。