由于工作中要使用DeepStream这个框架,绕不开gstreamer-1.0,于是这段时间学习了这个框架的用法。还没有能力去阅读源码。gstreamer框架中,gst-inspect-1.0和gst-launch-1.0这两个工具是必须要熟悉的,现就gst-launcher-1.0的用法做下笔记,以免日后遗忘。参考https://blog.csdn.net/u010168781/article/details/102805210
一、命令格式
gst-launch-1.0 [OPTIONS] PIPELINE-DESCRIPTION
## OPTIONS参数选项:
–help
-v, --verbose
-q, --quiet 不打印信息
-m, --messages 输出管道总线上的消息
-t, --tags 输出标记tag(也称为元数据)
-o FILE, --output=FILE 将管道保存到XML文件中,并退出
-f, --no_fault 不安装故障处理程序
-T, --trace 打印内存分配跟踪。必须在编译时启用该特性才能工作。
## PIPELINE-DESCRIPTION
元件: ELEMENTTYPE [PROPERTY1 …]
元件属性:PROPERTY=VALUE …,多个值之间用空格
箱子Bin: [BINTYPE.] ([PROPERTY1 …] PIPELINE-DESCRIPTION),通常在gst_parse_launch()函数中使用,构建部分管道,而不是完整的顶级管道
链接Link:[[SRCELEMENT].[PAD1,…]] ! [[SINKELEMENT].[PAD1,…]],将SRCELEMENT通过“!”链接到SINKELEMENT
[[SRCELEMENT].[PAD1,…]] ! CAPS ! [[SINKELEMENT].[PAD1,…]],CAPS表示过滤器,链接符合CAPS的PAD
//能力CAP:MIMETYPE [, PROPERTY[, PROPERTY …]]] [; CAPS[; CAPS …]],使用给定的mimetype和可选的给定属性创建功能。
能力属性:NAME=[(TYPE)] VALUE in lists and ranges: [(TYPE)] VALUE
二、用例
1、播放MP4音视频
MP4文件一般有2个流:音频流和视频流,部分文件会有字幕流。一般我们只处理2个流就够了。一般视频流采用h264编码,音频流采用aac编码。一开始由于不熟悉gst-inspect的用法,导致音视频解码器找不到,浪费了很多时间。
gst-inspect-1.0 | grep h264 找到h264解码器avdec_h264
gst-inspect-1.0 | grep aac 找到aac解码器avdec_aac。也可以用faad解码,faad输出为16位音频,avdec_aac输出为32位音频
gst-launch-1.0中关于demux的用法也摸索了好久,mp4文件要用到qtdemux(quick time demux),用names属性分离管道,正确用法如下
gst-launch-1.0 filesrc location=gongye.mp4 ! qtdemux name=demuxer demuxer. ! avdec_h264 ! xvimagesink 播放视频
gst-launch-1.0 filesrc location=gongye.mp4 ! qtdemux name=demuxer demuxer. ! avdec_aac ! audioconvert ! audioresample ! alsasink 播放音频(audioresample可选)
gst-launch-1.0 filesrc location=gongye.mp4 ! qtdemux name=demuxer demuxer. ! queue ! avdec_aac ! audioconvert ! alsasink demuxer. ! queue ! avdec_h264 ! xvimagesink 播放音视频
demuxer. 后面可以指定流名称,如 demuxer.video_0,demuxer.audio_0,流名称必须与文件中的流名称对应。
其他的文件格式,如flv,ogg,mpeg等文件都可以采用类似的方式,先用gst-inspect-1.0查找对应的demux和音视频解码器,然后构建管道即刻播放。
对于元件中的request pad,gst-launch-1.0也可以指定request pad的连接,典型如tee,nvstreammux等元件需要request pad,连接方式如下:
gst-launch-1.0 filesrc location=sample_720.h264 ! h264parse ! nvv4l2decoder ! smuxer.sink_0 nvstreammux name=smuxer width=1920 height=1080 batch-size=1 batched-push-timeout=4000000 ! nvinfer config-file-path=dstest1_pgie_path.txt ! nvvideoconvert ! nvdsosd ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=test.mp4
以上命令是对deepstream-test1的命令行模拟,但是缺少了osd探针函数,所以并不完整,但也可以运行,主要用于展示nvstreammux request pad(sink_%u)的用法。其中nvv4l2decoder是nvidia的硬解码元件,nvstreammux是deepstream队列元件,在使用nvinfer进行推理之前必须要使用该队列元件添加nvinfer所需要的数据。nvinfer是推理元件,配置文件为dstest1_pgie_path.txt。有关deepstream的资料,请另行查阅。
2、编码
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! videoconvert ! x264enc ! h264parse ! qtmux ! filesink location=1.mp4 -e
注意,尾部的-e不能省,表示按下ctrl-c键后会向视频流发送EOS标识,视频流才能完整编码。
3、rtp推流
发送端:gst-launch-1.0 v4l2src ! video/x-raw,format=YUY2,width=1280,height=720,framerate=10/1 ! videoconvert ! x264enc ! rtph264pay ! udpsink host=127.0.0.1 port=5600
接收端:gst-launch-1.0 udpsrc port=5600 caps='application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264' ! rtph264depay ! avdec_h264 ! videoconvert ! xvimagesink