文档链接说明
-
主要文档链接
4. Gstreamer工具以及MPP插件 — 快速使用手册—基于LubanCat-RK356x系列板卡 文档 -
常用命令
GStreamer命令行工具gst-play-1.0的全面指南与用法-CSDN博客
是什么?
- GStreamer是一个开源的多媒体框架,用于构建音频和视频处理应用程序
- GStreamer 的核心是基于管道(pipeline)的架构
- 通过将多媒体处理的各个步骤串联起来,实现复杂的媒体处理任务
为什么?
为什么有ffmpeg的前提下,还要使用GStreamer?
- 在某些情况下,GStreamer 会比 FFmpeg 更适合特定的需求
- FFmpeg 是一个功能强大的单体框架,主要专注于媒体的编解码、转码和流处理
- GStreamer适合构建复杂的媒体处理管道,如视频会议、实时流媒体处理和视频编辑
功能 | FFmpeg | GStreamer |
---|---|---|
核心架构 | Monolithic | 模块化,基于管道线 |
易用性 | 使用 CLI 更容易完成简单的媒体任务 | 需要更多设置,但管道灵活 |
编解码器支持 | 广泛的编解码器支持,几乎涵盖所有编解码器 | 功能强大,但通常需要额外的插件 |
使用案例 | 媒体转换、流媒体 | 转码、实时流媒体、媒体应用 |
模块化 | 模块化程度低,围绕特定命令构建 | 模块化程度高,可定制组件 |
插件系统 | 有限的插件系统,主要集中于编解码器 | 广泛的插件系统,用于自定义处理 |
实时处理 | 可以,但不直观 | 专为实时流媒体和处理而设计 |
跨平台 | 是(Linux、Windows、macOS 等) | 是(Linux、Windows、macOS 等) |
复杂性 | 对于简单的任务来说更简单 | 对于复杂的自定义媒体工作流程来说更好 |
许可 | LGPL 或 GPL(取决于配置) | LGPL |
开发者社区 | 庞大、活跃、被广泛采用 | 活跃,但规模小于 FFmpeg |
怎么做?
sudo add-apt-repository ppa:george-coolpi/multimedia
sudo apt updatesudo apt-get install gstreamer1.0-rockchip# 测试是否安装成功gst-inspect-1.0 mppvideodec
核心本质
本质就三个核心命令,两个名词
- 命令
- 插件
gst-launch-1.0
gst-play-1.0
gst-inspect-1.0
常用命令
gst-launch-1.0
- gst-launch-1.0 构建数据流管道,以处理音频和视频数据,进行实时流处理、编码、解码、转码等操作
gst-launch-1.0 -v imxv4l2src device=/dev/video1 ! "video/x-raw, format=(string)YUY2, width=(int)1024, height=(int)768, framerate=(fraction)30/1" ! imxv4l2sink
gst-play-1.0
- gst-play-1.0 播放本地文件或流式媒体
# 播放test.mp4,并通过xvimagesink显⽰
gst-play-1.0 test.mp4 --videosink=xvimagesink
gst-inspect-1.0
- gst-inspect-1.0 用于查看 GStreamer 中可用的插件、元素和它们的属性
# 列出xvimagesink插件的所有信息
gst-inspect-1.0 xvimagesink
常⽤插件
Source
- Source插件用于生成和提供媒体数据流。
- 它们可以从不同的数据源读取音频或视频,比如文件、网络、设备等。
- 常见的Source插件包括文件源(如 filesrc)、网络源(如 tcpserversrc)、设备源(如 v4l2src)
filesrc videotestsrc v4l2src
#读取/tmp/test文件数据 到/tmp/test2
gst-launch-1.0 filesrc location=/tmp/test ! filesink location=/tmp/test2# 使⽤videotestsrc按照指定格式⽣成视频数据,并通过xvimagesink显⽰
gst-launch-1.0 videotestsrc ! "video/x-raw,width=1920,height=1080,format=(string)NV12" ! xvimagesink#从v4l2src获取摄像头视频数据,通过device属性指定摄像头,按照指定格式输出视频通过xvimagesink显⽰
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1920,height=1080,format=NV12 ! xvimagesink
rtspsrc rtspclientsink
- rtspsrc:它可以从RTSP服务器拉取RTSP音视频流,并将其传递给管道的下游元素进行处理
- rtspclientsink:用于将处理后的音视频流发送到RTSP服务器
#安装插件
sudo apt install gstreamer1.0-rtsp
Sink
- GStreamer的Sink插件用于接收和处理媒体数据流
- 通常用于输出到不同的目标,例如文件、音频设备、视频显示等。
- 常见的Sink插件包括文件接收器(如filesink)、音频输出(如 alsasink)、视频显示(如 ximagesink)
filesink fakesink
#读取/tmp/test文件数据到/tmp/test2
gst-launch-1.0 filesrc location=/tmp/test ! filesink location=/tmp/test2#将收到的/tmp/test数据全部丢弃
gst-launch-1.0 filesrc location=/tmp/test ! fakesink
xvimagesink kmssink waylandsink rkximagesink
#接收videotestsrc视频并通过xvimagesink显⽰,使⽤X11接口实现
gst-launch-1.0 videotestsrc ! xvimagesink
# 使⽤kms接口实现
gst-launch-1.0 videotestsrc ! kmssink
# 使⽤wayland接口实现
gst-launch-1.0 videotestsrc ! waylandsink
# 使⽤drm接口实现零拷⻉
gst-launch-1.0 videotestsrc ! rkximagesink
fpsdisplaysink
- 播放
test.mp4
文件 - 视频使用
xvimagesink
渲染并显示帧率 - 音频使用第二个声卡输出,且视频播放不与音频同步
gst-play-1.0 --flags=3 --videosink="fpsdisplaysink video-sink=xvimagesink signal-fps-measurements=true text-overlay=false sync=false" --audiosink="alsasink device=hw:1,0" test.mp4
-
--flags=3
: 表示同时启用视频和音频播放,关闭字幕 -
--videosink="fpsdisplaysink video-sink=xvimagesink signal-fps-measurements=true text-overlay=false sync=false"
: 这个参数指定了视频输出的处理方式:fpsdisplaysink
:这是一个特殊的视频接收器,用于显示帧率(FPS)video-sink=xvimagesink
:指定使用xvimagesink
作为视频渲染的后端signal-fps-measurements=true
:启用帧率测量信号,这允许fpsdisplaysink
显示当前的帧率。text-overlay=false
:禁用文本覆盖,即不在视频上显示帧率文本。sync=false
:设置为false
表示视频播放不与音频同步。
-
--audiosink="alsasink device=hw:1,0"
: 这个参数指定了音频输出的处理方式:alsasink
:指定使用 ALSA(Advanced Linux Sound Architecture)作为音频输出后端。device=hw:1,0
:指定使用特定的 ALSA 设备。hw:1,0
表示使用第二个声卡的第一个子设备。
-
test.mp4
: 这是要播放的视频文件的名称。
Rockchip MPP插件
- 基于Gstreamer原有GstVideoDecoder类和GstVideoEncoder类开发
- 默认系统已经安装mpp插件
#查看mpp插件
gst-inspect-1.0 | grep mpp#信息输出如下
rockchipmpp: mpph264enc: Rockchip Mpp H264 Encoder
rockchipmpp: mpph265enc: Rockchip Mpp H265 Encoder
rockchipmpp: mppvp8enc: Rockchip Mpp VP8 Encoder
rockchipmpp: mppjpegenc: Rockchip Mpp JPEG Encoder
rockchipmpp: mppvideodec: Rockchip's MPP video decoder
rockchipmpp: mppjpegdec: Rockchip's MPP JPEG image decoder
gstmppdec 命令
- 包含插件mppvideodec,mppjpegdec
gstmppenc 命令
- 包含插件mpph264enc,mppvp8enc,mppjpegenc等
更多命令(Rockchip MPP插件)
- 会用到mppvideodec ,mpph264enc
多路视频播放 render-rectangle
render-rectangle
# 使⽤xvimagesink的render-rectangle指定不同的渲染位置
gst-launch-1.0 filesrc location=/home/cat/test.mp4 ! parsebin ! mppvideodec ! \
xvimagesink render-rectangle='<0,0,400,400>' &
gst-launch-1.0 filesrc location=/home/cat/test.mp4 ! parsebin ! mppvideodec ! \
xvimagesink render-rectangle='<0,500,400,400>' &
parsebin
:这个元素自动解析和构建管道的其余部分,根据文件类型和可用的解码器。mppvideodec
:这是一个视频解码器元素,用于解码视频流render-rectangle='<0,0,400,400>'
:这个属性指定视频渲染的位置和大小。在这个例子中,视频将被渲染到屏幕的左上角,起始坐标为 (0,0),大小为 400x400 像素。
编码预览 tee
使⽤tee插件,将摄像头采集的数据拷⻉为两路
- ⼀路送⾄mpph264enc进⾏编码,而后送⾄filesink保存⽂件
- ⼀路送⾄autovideosink显⽰
gst-launch-1.0 v4l2src ! 'video/x-raw,width=1920,height=1080,format=NV12' ! tee name=tv ! queue ! mpph264enc ! 'video/x-h264' ! h264parse ! 'video/x-h264' ! filesink location=/home/cat/out.h264 tv. ! queue ! autovideosink
- tee name=tv:
tee
元素用于将视频流复制到多个路径。name=tv
为 tee 元素指定了一个名称,以便后续可以通过这个名称引用它。
- queue:
queue
元素用于在元素之间缓冲数据流,防止数据流的阻塞。
- filesink location=/home/cat/out.h264:
filesink
元素用于将视频流写入文件。这里指定了文件的保存位置为/home/cat/out.h264
。
- tv. ! queue ! autovideosink:
- 这部分将 tee 元素的输出(
tv.
)连接到另一个queue
元素,然后连接到autovideosink
元素 autovideosink
元素用于自动选择合适的视频渲染器(如xvimagesink
或glimagesink
)来在屏幕上显示视频。
- 这部分将 tee 元素的输出(
拆分码流 qtdemux
qtdemux
- 将qtdemux命名为qt
- qt.audio_0就是第⼀个⾳频流
- qt.video_0就是第⼀个视频流
gst-launch-1.0 filesrc location=test.mp4 ! qtdemux name=qt qt.audio_0 ! queue ! \
filesink location=audio.bin qt.video_0 ! queue ! filesink location=video.bin
这条命令实现了以下功能:
- 读取一个 MP4 文件(
test.mp4
)。 - 使用
qtdemux
元素将文件分解为音频和视频流。 - 将音频流保存到
audio.bin
文件中。 - 将视频流保存到
video.bin
文件中。
AFBC(ARM Frame Buffer Compression)
- AFBC全称ARM Frame Buffer Compression,是⼀种压缩格式,⽤于节省带宽。
- ⽬前mppvideodec插件⽀持AFBC的编码格式有:H264,H265,VP9
- ⽀持的⾊彩格式有NV12,NV12 10bit,NV16
效果对比
- 没有开启AFBC时,帧率在45-50帧
- 开启AFBC时测试 帧率在69-75帧
# 开启全局AFBC,适⽤于使⽤gst-play-1.0等⽆法直接操作mppvideodec的情况
export GST_MPP_VIDEODEC_DEFAULT_ARM_AFBC=1# 单独开启AFBC
gst-launch-1.0 filesrc location=test.mp4 ! parsebin ! mppvideodec arm-afbc=true \
! waylandsink
#通过fpsdisplaysink获取帧率
GST_DEBUG=fpsdisplaysink:7 gst-play-1.0 --flags=3 --videosink="fpsdisplaysink \
video-sink=xvimagesink signal-fps-measurements=true text-overlay=false \
sync=false" test.mp4
- GST_DEBUG=fpsdisplaysink:7:
fpsdisplaysink:7
级别 7 表示最高级别的调试信息,会输出大量的调试数据。
与RTSP融合
本地推流/拉流
- 测试USB摄像头,摄像头接口为device=/dev/video9
- 需要先运行接收端命令,然后再运行服务端(注意如果是ssh需要指定export DISPLAY=:0环境变量)
#板卡接收端
gst-launch-1.0 udpsrc port=1234 ! "application/x-rtp, payload=96" ! rtph264depay ! decodebin ! autovideosink sync=false
- 接收端,命令通过udpsrc从指定的端口(1234)接收RTP数据流,使用rtph264depay解封装RTP数据,接着通过decodebin解码视频流,最后将解码后的视频输出到自动选择的视频窗口(autovideosink)
#板卡服务端测试1
gst-launch-1.0 v4l2src device=/dev/video9 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! video/x-raw,format=UYVY ! mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
- 服务端测试1:使用v4l2src直接捕获原始视频流,输出为YUYV格式,并进行H.264编码,然后通过rtph264pay封装成RTP数据包,最后使用udpsink将数据推送到指定的地址(127.0.0.1:1234)
#板卡服务端测试2
gst-launch-1.0 v4l2src device=/dev/video9 ! image/jpeg ! mppjpegdec ! videoconvert ! video/x-raw,height=1080,width=1920,frame=30/1,format=NV12 ! mpph264enc ! queue ! h264parse ! rtph264pay ! udpsink host=127.0.0.1 port=1234
- 服务端测试2:同样使用v4l2src,但输入的是JPEG格式的图像,通过解码后再转换成NV12格式,并进行H.264编码,然后通过rtph264pay封装成RTP数据包,最后使用udpsink将数据推送到指定的地址(127.0.0.1:1234)。
RTSP推流/拉流
- 推流前需要启动RTSP服务器,需要运行mediamtx
- 访问: mediamtx,下载mediamtx_vx.x.x_linux_arm64v8.tar.gz
- 将mediamtx_v1.9.1_linux_arm64v8.tar.gz传到板卡解压并运行
#运行mediamtx
sudo ./mediamtx &
- 将视频流发送到RTSP服务器,简单⽰例
gst-launch-1.0 v4l2src device=/dev/video9 ! image/jpeg ! mppjpegdec ! videoconvert ! video/x-raw,height=1080,width=1920,frame=30/1,format=NV12 ! tee name=t \
t. ! queue ! videoconvert ! autovideosink \
t. ! videoconvert ! mpph264enc ! queue ! h264parse ! rtspclientsink location=rtsp://127.0.0.1:8554/live
- 从RTSP服务器中获取视频流
#指定为实际推流板卡ip
gst-launch-1.0 rtspsrc location=rtsp://192.168.103.101:8554/live ! rtph264depay ! h264parse ! mppvideodec ! xvimagesink