Gstreamer系列(4):Gstreamer在x86平台使用硬编码对视频进行保存mp4,推拉流

        前面的博客介绍了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命令。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁本美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值