协议-RK-Gstreamer

发布于:2025-02-10 ⋅ 阅读:(45) ⋅ 点赞:(0)

文档链接说明


是什么?

  • 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 update

 sudo 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 元素用于自动选择合适的视频渲染器(如 xvimagesinkglimagesink)来在屏幕上显示视频。

拆分码流 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

网站公告

今日签到

点亮在社区的每一天
去签到