GStreamer 使用介绍
1.1. GStreamer 介绍
GStreamer 是一个用于构建流媒体应用程序的开源多媒体框架,旨在简化音频/视频应用程序的开发。
1.1.1 基本概念
- 管道 (pipeline): 一个完整的 GStreamer 工作流。它是多媒体任务处理的基本单位(必须以 source 类【元素】开始,并以 sink 类【元素】结束)。

1.1.1 基本概念 图1
- 元素 (element): 工作流中的各个节点(如 source、filter、sink 等)。元素之间通过【管道】传递数据。

1.1.1 基本概念 图2
- 焊盘/接口 (Pad): 数据进出元素的接口。输入 Pad 称为 sinkPads,输出 Pad 称为 srcPads。

1.1.1 基本概念 图3
部分元素具有多个 Pad,例如解复用器(demuxer)和 tee 等。

1.1.1 基本概念 图4
1.1.2 GStreamer 工具
-
gst-launch-1.0:用于构建并启动管道的强大工具。
-
gst-inspect-1.0:显示可用插件和元素的信息。
1.1.3 GStreamer 调试信息
可以使用 GST_DEBUG 环境变量显示调试信息。
export GST_DEBUG=21.2. 编码
请在相关手册中确认与 MIPI-CSI 或 USB Camera 相关的视频节点。
1.2.1 录像保存
通过串口调试或 SSH 调试进入开发板环境。

1.2.1 录像保存 图5
假设 cam0 的设备节点为 video23,输入以下命令进行录像。
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e
1.2.1 录像保存 图6
按下【Ctrl+C】结束录像后,会生成 ts 文件。
也可以调整帧率和分辨率进行录像:

1.2.1 录像保存 图7
# 帧率调整
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! videoconvert ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e# 分辨率和帧率调整
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,width=1280,height=800,framerate=30/1 ! videoconvert ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e也可以录制为 flv 格式或 H.264 裸流。
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! h264parse ! flvmux ! filesink location=./1.flv -e基本流
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! filesink location=./1.h264 -e1.2.2 UDP 流媒体
首先,创建一个名为 gst_test.sdp 的文件。

5.2.2 UDP 流媒体 图8
使用文本编辑器(如记事本)打开该文件,并添加以下内容(注意:两处 IP 地址都需要修改为用户 PC 的 IP 地址)。
Plaintextv=0o=- 0 0 IN IP4 192.168.10.111s=H.264 Stream from RV1126c=IN IP4 192.168.10.111t=0 0m=video 8554 RTP/AVP 96a=rtpmap:96 H264/90000然后,使用 VLC 媒体播放器打开创建的文件(参见下图)。

1.2.2 UDP 流媒体 图9

1.2.2 UDP 流媒体 图10
adb shell使用命令登录到【开发板环境】,并输入以下命令(注意:命令中的 IP 地址需要修改为用户 PC 的 IP 地址)。这样会将 video 节点的视频编码,并通过 UDP 推流到 PC 端的 VLC。
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! mpph264enc ! h264parse ! rtph264pay config-interval=1 ! queue max-size-buffers=100 leaky=downstream ! udpsink host=192.168.10.111 port=8554 sync=false执行结果(运行效果)如下:

1.2.2 UDP 流媒体 图11

1.2.2 UDP 流媒体 图12
1.2.3 RTSP 服务器
安装 rtspServer 相关库,获取源码并进行编译。
sudo apt-get install libgstrtspserver-1.0-dev安装【成功】后,执行以下命令获取 rtspServer 应用程序的源代码:
wget https://raw.githubusercontent.com/GStreamer/gst-rtsp-server/1.14/examples/test-launch.c然后使用以下命令编译该源代码:
gcc test-launch.c -o test-launch \$(pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0)成功生成 test-launch 后,使用以下命令运行该 rtspServer:
./test-launch "v4l2src device=/dev/video23 ! mpph264enc ! rtph264pay name=pay0 pt=96"最后,使用 VLC 通过 8554 端口接收(拉取)RTSP 流。

1.2.3 RTSP 服务器 图13

1.2.3 RTSP 服务器 图14
如果需要指定分辨率和帧率,请参考以下示例:
./test-launch "v4l2src device=/dev/video23 ! video/x-raw,width=1920,height=1080,framerate=30/1 ! videoconvert ! mpph264enc ! rtph264pay name=pay0 pt=96"1.3 注意事项
编码时,请不要设置超过编码格式最大能力的帧率。
1.4. 解码
1.4.1 录像文件解码
执行以下命令进行解码和播放。
gst-launch-1.0 filesrc location=/userdata/1.ts ! tsdemux ! queue ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink
1.4.1 录像文件解码 图15
当同一文件位于 /userdata/ 目录下时,播放 FLV 格式视频:
gst-launch-1.0 filesrc location=./1.flv ! flvdemux ! h264parse ! mppvideodec ! videoconvert ! videoflip method=1 ! autovideosink播放 H.264 裸流(Raw stream)视频:
gst-launch-1.0 filesrc location=/userdata/1.h264 ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false1.4.2 RTSP 流接收解码
接收并显示来自 IPCamera 的流。
gst-launch-1.0 rtspsrc location=rtsp://admin:a12345678@192.168.5.68 ! rtph264depay ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false
1.4.2 RTSP 流接收解码 图16
1.5. 分流器(tee)的使用
例如在将视频显示到屏幕的同时进行录像时,可以使用分流器(tee)。
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! tee name=t t. ! queue ! videoflip method=1 ! autovideosink sync=false t. ! queue ! mpph264enc ! mpegtsmux ! filesink location=./1.ts节点图解:

1.5. 分流器(tee)的使用 图17
可以将该命令分为以下三个部分来理解:
第一部分,获取视频流:
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! tee name=t第二部分,复制视频流并输出到显示窗口(autovideosink):
t\. ! queue ! videoflip method=1 ! autovideosink sync=false第三部分,复制视频流并发送到编码器,最终封装为 TS 文件:
t\. ! queue ! mpph264enc ! mpegtsmux ! filesink location=./1.ts1.5.1 注意事项
分流器(tee)的实现原理是通过 CPU 复制数据并发送到管道。因此,如果用它处理原始格式(如 YUV/RGB 等)的数据,会增加 CPU 和内存负载(开销)。
1.6. gst-inspect-1.0 的使用
列出全部元素
gst-inspect-1.0!1.6. gst-inspect-1.0 的使用 图18](https://dl.dragonwake.com/images/docs-assets/rv1126b/Application-Note/gstreamer-usage-gst-inspect-1-0-usage-figure-18.png)
1.6. gst-inspect-1.0 的使用 图18
查看特定元素信息
gst-inspect-1.0 v4l2src
1.6. gst-inspect-1.0 的使用 图19
1.7. GStreamer 文档
官方网站: GStreamer 官方文档