08 GStreamer
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格式的数据转成标准的像素格式
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 队列)multiqueuetee(一分多路)input-selector,output-selector(流切换)
其他
identity(调试用, passthrough)fakesink,fakesrc(测试用)clockoverlay,timeoverlay(时间戳叠加)capsfilter(能力过滤器)该模块可以加在任意2个Element之间,用于强制限制数据格式,它的用法如下(可以直接放在!之后,也可以放在capsfilter caps=之后)
1 | media-type, property1=value1, property2=value2, ... |
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 插件提供的功能模块,例如
filesrc、videoconvert、autovideosink等 - 属性:元件的配置参数,例如
location(文件路径)、width(视频宽度)等 - 连接符(
!):将元件的输出连接到下一个元件的输入
命令行工具
GStreamer框架给我们了一些CLI工具进行调试,比较重要的有一下2个
1.gst-launch-1.0:用于快速搭建pipeline,通过该工具可以搭建完整的一个数据输入输出流,进行测试
2.gst-inspect-1.0:用于查看某个Element的用法,比如:
1 | # 查看nvvidconv这个Element的用法 |
需要重点关注的是Element的输入,输出的数据格式,以及支持的属性,后续可以通过capsfilter来只保留某个格式的数据
GStreamer 的每个 Element 都有 Pad(接口),常见类型:
- SINK pad → 输入端(接收数据)
- SRC pad → 输出端(输出数据)
例子
1.在Jetson平台读取RTSP视频流,并把数据给下游APP使用
1 | gst-launch-1.0 rtspsrc location=rtsp://admin:waterline123456@192.168.1.64:554,latency=0 ! \ |
- 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 | gst-launch-1.0 nvarguscamerasrc num-buffers=1 ! \ |
