瑞芯微(EASY EAI)RV1126B gstreamer使用介绍
GStreamer 是用来构建流媒体应用的开源多媒体框架(framework)。其目标是要简化音/视频应用程序的开发。
1. GStreamer介绍
GStreamer 是用来构建流媒体应用的开源多媒体框架(framework)。其目标是要简化音/视频应用程序的开发。
1.1 基本概念
管线(pipeline):又称为管道或流水线,是一个完整的GStreamer工作流,即:一个多媒体任务处理的基本单元(必须要以source类【元素】开头,以sink类【元素】结尾)。

元素(element):GStreamer工作流中的每一个节点,例如source类元素、filter类元素、sink类元素。元素与元素之间通过【管道】进行数据传递(而【管道】又通过【衬垫】与【元素】进行连接)。

衬垫(Pad):数据通过衬垫进入或离开这个元素,输入衬垫叫sinkPads,输出衬垫叫srcPads,每个元素都会至少一个衬垫,如source类元素和sink类元素。

有些元素会有多个衬垫,比如:解复用器(demuxer)和分流器(tee)。

1.2 Gstreamer工具
gst-launch-1.0:gst-launch-1.0是Gstreamer中一个常用和强大的工具,用于创建并启动多媒体管道图。它可以从标准命令行读取管道图的描述,用户可以在命令行中直接运行该描述。它不需要复杂的编程或脚本,使用户方便地测试和调试管道图。
gst-inspect-1.0:gst-inspect-1.0可以打印出可用 GStreamer 插件的信息、特定插件的信息或特定元素的信息。当在没有PLUGIN或ELEMENT参数的情况下执行时,gst-inspect-1.0将打印所有插件和元素的列表以及sumary。当使用PLUGIN或ELEMENT参数执行时,gst-inspect-1.0将打印有关该插件或元素的信息。
1.3 Gstreamer调试信息
使用GST_DEBUG环境变量,可查看调用Gstreamer时所产生的打印信息。比如在终端输入以下命令。
export GST_DEBUG=2
如果想看到更详细的信息,调试等级可设为3。
2. 编码
下文用到的video节点,可以通过以下几篇文章查询:
MIPI-CSI:《外设接口使用说明/摄像头/MIPI-CSI摄像头》
USB Camera:《外设接口使用说明/摄像头/USB摄像头》
2.1 保存录像

经查询,cam0的设备节点是video23。
输入下方命令,即可对video23节点进行录像。效果如下图所示。
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e

按下组合键【Ctrl+C】后即可退出录像,并得到一个ts文件(MPEG-TS:MPEG Transport Stream)。可在PC端Ubuntu系统用scp的方式从板卡拉取ts文件,并且可以通过vlc对其解码播放。

调整帧率录制:
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
除了ts格式,还有通过下方命令录制其它格式的视频:
-flv格式录制:
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 -e
2.2 UDP推流
首先创建一个名为gst_test.sdp的文件。

用记事本打开此文件,添加如下内容(注意两个IP地址均为用户电脑的IP地址):
v=0
o=- 0 0 IN IP4 192.168.3.191
s=H.264 Stream from RK3576
c=IN IP4 192.168.3.191
t=0 0
m=video 8554 RTP/AVP 96
a=rtpmap:96 H264/90000
然后通过vlc打开刚才设置的文件,如下图所示:

通过adb shell进入【开发板环境】,输入下方命令(注意命令中的IP地址为用户电脑的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.3.191 port=8554 sync=false
执行现象如下:

2.3 rtsp服务器
如果要用gstreamer搭建rtsp服务器,则需要额外的库以及第三方基于此库开发的gstreamer应用。
首先,用apt-get安装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流。

若要指定分辨率和帧率,可以采用下方的例子:
./test-launch "v4l2src device=/dev/video23 ! video/x-raw,width=1920,height=1080,framerate=30/1 ! videoconvert ! mpph264enc ! rtph264pay name=pay0 pt=96"
2.4 注意事项
编码时要注意编码帧率,不能超过编码格式的最大能力。(假如编h.264的最大帧率只能到30帧,那么给h.264编到60帧。无论是录制还是推流,再解码端都会发生异常)
3. 解码
3.1 录像文件解码
如果录像文件名为1.ts,并且位于/userdata/目录中,就执行下方命令即可用gstreamer解码并播放。否则需要调整一下文件位置。
命令执行后,桌面系统会出现一个窗口,并播放文件的内容,效果如下所示。
gst-launch-1.0 filesrc location=/userdata/1.ts ! tsdemux ! queue ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink

注:如果无法满屏播放,请参考一下本文的==2.1保存录像==章节,调整一下分辨率。
同样文件在/userdata/目录中,播放flv格式视频:
gst-launch-1.0 filesrc location=./1.flv ! flvdemux ! h264parse ! mppvideodec ! videoconvert ! videoflip method=1 ! autovideosink
播放h.264裸流视频:
gst-launch-1.0 filesrc location=/userdata/1.h264 ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false
3.2 rtsp拉流解码
执行下方命令,即可对一个地址为rtsp://admin:a12345678@192.168.5.68的IPCamera进行拉流并显示。
gst-launch-1.0 rtspsrc location=rtsp://admin:a12345678@192.168.5.68 ! rtph264depay ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false
命令执行后,MIPI-DSI屏上会出现一个窗口,并播放IPCamera的内容,效果如下所示。

4. 分流器使用(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
节点图解:

命令可拆分为三个部分理解:
第一部分,取视频流:
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.ts
4.1 注意事项
分流器的实现原理是通过CPU复制一份,送入管道,因此如果用于处理原格式(YUV/RGB等)数据,将会加大CPU以及内存的开销。
5. gst-inspect-1.0使用
5.1 列出所有元素
直接输入gst-inspect-1.0命令即可列出所有元素,及其简要描述,如下所示。
gst-inspect-1.0

5.2 查看元素信息
采用gst-inspect-1.0加元素名的方式,即可查看这个元素的详细信息,如下所示。
gst-inspect-1.0 v4l2src

5.3 使用技巧
gst-inspect-1.0可以配合grep来初步筛选自己感兴趣的【元素】,比如pcma格式相关的音频插件元素,如下所示。
gst-inspect-1.0 | grep pcma
gst-inspect-1.0 | grep law

6. Gstreamer文档
Gstreamer文档的官网地址:
https://gstreamer.freedesktop.org/documentation/?gi-language=c
更多推荐



所有评论(0)