GStreamer

基本概念

GStreamer是一个跨平台的流媒体框架,采用基于管道的插件化架构,支持音视频采集、编解码、渲染等全流程处理。应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。例如摄像头采集(v4l2src)、视频编码(nvv4l2h264enc)等模块可灵活拼接,组成流水线

Element

Source 元件(数据源)

产生媒体流的元素

  • 文件源:filesrc (从文件读取)
  • 设备源:v4l2src (摄像头, Video4Linux2), alsasrc (音频输入), pulsesrc (PulseAudio输入), audiotestsrc, videotestsrc (测试源)
  • 网络源:udpsrc, tcpclientsrc, rtmpsrc, rtspclientsrc
  • 特殊硬件源 (Jetson/NVIDIA):nvarguscamerasrc, nvv4l2camerasrc

注意:

1.v4l2src并不等同于V4L2,它只是用GStreamer框架对V4L2做了一层封装,V4L2支持的像素格式它未必就全部支持,比如IMX219输出的是10bit的Bayer格式,但是v4l2src就不支持,所以Gstreamer框架就没办法直接用v4l2src来获取IMX219的数据了

2.nvarguscamerasrc是NVIDIA提供的一个插件,专门用来获取CSI数据的,它内部也是基于了V4L2框架,并利用了MM API来通过硬件加速ISP处理,最后把bayer raw格式的数据转成标准的像素格式

image-20250820103642796

Sink 元件(数据输出)

输出到屏幕、音频设备或文件

  • 文件输出:filesink
  • 显示输出:xvimagesink, glimagesink, ximagesink, waylandsink
  • 音频输出:alsasink, pulsesink, autoaudiosink
  • 网络输出:udpsink, tcpserversink, rtmpsink

Demux / Parser(分流 / 解析)

负责把封装的媒体文件拆成音视频流

  • qtdemux (MP4/MOV), matroskademux (MKV), avidemux (AVI)
  • mpegtsdemux (MPEG-TS), flvdemux (FLV), oggdemux (Ogg)
  • h264parse, h265parse, aacparse, mpegvideoparse

Decoder(解码器)

把压缩数据解码成原始数据

  • 视频解码:avdec_h264, avdec_h265, avdec_mpeg4, vp8dec, vp9dec
  • 音频解码:avdec_aac, avdec_mp3, flacdec, opusdec, vorbisdec
  • 硬件解码 (NVIDIA Jetson):nvv4l2decoder, nvh264dec, nvh265dec

Encoder(编码器)

压缩音视频

  • 视频编码:x264enc, x265enc, vp8enc, vp9enc, theoraenc
  • 音频编码:voaacenc, opusenc, vorbisenc, lamemp3enc
  • 硬件编码 (NVIDIA Jetson):nvv4l2h264enc, nvv4l2h265enc

Filter / Converter(转换与处理)

对音视频做处理

  • 格式/像素转换:videoconvert, audioconvert
  • 分辨率/采样率:videoscale, audiorate
  • 颜色空间:videoconvert, nvvidconv (NVIDIA)
  • 效果滤镜:edgetv, vertigotv, agingtv (演示用)
  • 混合/合成:compositor (视频混合), audiomixer (音频混合)

Muxer(复用器)

把音视频流打包成封装格式

  • qtmux (MP4/MOV), matroskamux (MKV), avimux (AVI)
  • mpegtsmux (MPEG-TS), flvmux (FLV), oggmux

Queue / 管道控制

  • queue (简单 FIFO 队列)
  • multiqueue
  • tee (一分多路)
  • input-selector, output-selector (流切换)

其他

  • identity (调试用, passthrough)
  • fakesink, fakesrc (测试用)
  • clockoverlay, timeoverlay (时间戳叠加)
  • capsfilter (能力过滤器)该模块可以加在任意2个Element之间,用于强制限制数据格式,它的用法如下(可以直接放在!之后,也可以放在capsfilter caps=之后)
1
2
3
media-type, property1=value1, property2=value2, ...
# 例子:
video/x-raw, format=(string)BGR, width=(int)1280, height=(int)720

media-type:媒体类型,比如:

  • video/x-raw(原始视频帧)
  • audio/x-raw(原始音频帧)
  • image/jpeg(JPEG 压缩图像)
  • video/x-h264(H.264 压缩流)

property=value:属性约束,属性类型必须注明

管道用法

管道描述格式如下:

1
元件1 属性1=值1, 属性2=值2 ! 元件2 ! 元件3 ...
  • 元件(Element):GStreamer 插件提供的功能模块,例如 filesrcvideoconvertautovideosink
  • 属性:元件的配置参数,例如 location(文件路径)、width(视频宽度)等
  • 连接符(!):将元件的输出连接到下一个元件的输入

命令行工具

GStreamer框架给我们了一些CLI工具进行调试,比较重要的有一下2个

1.gst-launch-1.0:用于快速搭建pipeline,通过该工具可以搭建完整的一个数据输入输出流,进行测试

2.gst-inspect-1.0:用于查看某个Element的用法,比如:

1
2
# 查看nvvidconv这个Element的用法
gst-inspect-1.0 gst-inspect-1.0 nvvidconv

需要重点关注的是Element的输入,输出的数据格式,以及支持的属性,后续可以通过capsfilter来只保留某个格式的数据

image-20250820103341785

GStreamer 的每个 Element 都有 Pad(接口),常见类型:

  • SINK pad → 输入端(接收数据)
  • SRC pad → 输出端(输出数据)

例子

1.在Jetson平台读取RTSP视频流,并把数据给下游APP使用

1
2
3
4
gst-launch-1.0 rtspsrc location=rtsp://admin:waterline123456@192.168.1.64:554,latency=0 ! \
rtph264depay ! h264parse ! omxh264dec ! nvvidconv ! \
video/x-raw, width=3840, height=2160, format=BGRx ! \
videoconvert ! appsink sync=false
  • gst-launch:GStreamer提供的一个命令行工具,用于快速搭建管道并测试
  • rtspsrc:从 RTSP 服务器拉取视频流
  • rtph264depay:用于将 RTP 包中的 H.264 视频数据提取出来
  • h264parse、omxh264dec:解析 H.264 视频流,并用OpenMAX硬件加速
  • nvvidconv:NVIDIA 视频转换元件,用于视频格式的转换(YUYV->BGRx)和分辨率的缩放
  • video/x-raw xxxx:利用Capsfilter对数据进行过滤
  • videoconvert:用于将视频帧转换为其他格式(色彩空间、下游元件的数据结构),符合后面的sink原件的要求
  • appsink:将视频帧传递给应用程序,由应用程序自行处理

2.在Jetson平台读取CSI RAW数据,并把数据保存成jpg文件

1
2
gst-launch-1.0 nvarguscamerasrc num-buffers=1 ! \
'video/x-raw(memory:NVMM), width=1920, height=1080, format=NV12, framerate=30/1' ! \ nvjpegenc ! filesink location=test.jpg