使用平台:飞凌OK3399-C开发板
gst-launch-1.0是构建和运行基本GStreamer管道的工具
命令格式:
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管道文本描述信息
其中,options中的参数我平时基本用的很少,详细说一下管道部分描述。
说一下语法:
例如:gst-launch-1.0 videotestsrc ! autovideosink
这是一个最简单的播放视频的命令,播放的是测试视频,如下:
管道描述串部分的内容是videotestsrc ! autovideosink
这部分包括三个部分:
管道的起始点:videotestsrc
管道终点:autovideosink
起始点和终点的连接:!类似理解成两节管子,中间焊接起来。
这个管道描述串的意思是,把元素 videotestsrc 连接到元素 autovideosink 上。这个例子中,如果没有叹号进行连接,执行的时候不会报错,但是时没有执行结果的,因为管道没有工作。
就像:gst-launch-1.0 videotestsrc autovideosink
和上面的一条相比只是少了一个叹号,这就没有组成一个管道。就像两节管子,中间没有焊接,就会漏水。所以这里只有个两个部分,一个是叫元素videotestsrc,另外一个元素 autovideosink
要建立连接,首先需要命名,gst-launch-1.0 videotestsrc name=a autovideosink name=b
这一条和上面的区别是分别加了name=。于是变成了第一个元素是videotestsrc name=a
,第二个元素是autovideosink name=b
。同样没有连接,也是没有结果的。
所以要出现结果,必须要建立连接。
gst-launch-1.0 videotestsrc name=a autovideosink name=b a.src ! b.sink
在后面加入a.src ! b.sink按对应名字加入了连接,可以出现执行结果。留下两个疑问,1、为什么name=a,但是连接的时候要用a.src。2、为什么开头的命令,没有加名字,依然能执行。
gst-launch-1.0 videotestsrc name=a a.src ! b.sink autovideosink name=b
这个命令和上一条结果是一样的,但是看起来比较乱是因为gst-launch-1.0命令不在乎顺序,元素的描述和连接先后顺序不固定。将连接部分放到前面和中间,执行都是一样的。
下面看一个3399手册上的命令:
gst-launch-1.0 filesrc location=/home/forlinx/video/1080p_60fps_h264.mp4 ! qtdemux ! queue ! h264parse ! mppvideodec ! waylandsink
这是3399H264硬解码的命令,filesrc元素是用来指定文件;qtdemux是qt的解复用器,可以理解成解封装,mp4格式是由视频音频等组合封装到一起的。queue查资料理解为设置一个队列,用来解码播放。H264parse用来分割输出H264帧数据,也就是用来将H264编码的视频的每一帧进行分割。mppvideodec 是视频播放的部分,具体没有详细了解。Waylandsink是带视频叠加的示例,也就完成了在界面上的显示。
发现一个规律, 一个管道,都是从src开始,sink结束。那么怎么判断这个元素是src还是sink呢。使用gst-inspect-1.0命令,比如gst-inspect-1.0 filesrc
显示pad是src,另外下面除了location还可以有很多描述属性。
继续查看autovideosink元素:
说明pad是sink。
查看一个其他的元素:queue
显示其既有src又有sink。
经查(理解不一定对),src是source的缩写,意思为原始材料;sink代表下沉,渗透,完全理解。理解为只有一个src属性的只能放在管道的开始,也就是只能传输数据给后级,作为原始材料,也就是这个元素只能输出。Sink的只能接收,不能往下级传递。两个属性都有的元素,可以放在中间,既能接收,又能向下级传递。可以解决第一个问题,需要确定这个名字对应的元素是做输入还是输出。又引出另一个问题:开头的元素命名叫a.src结尾的叫b.sink,中间的应该叫什么?
回答第二个问题,不需要用名字来连接的原因是用到的元素都是只有一个输入和一个输出的,不需要用pad来定义其连接方式。可以直接使用元素名字这个简化用法。
最后一个问题,参考3399上的的命令
中间的元素在使用名字连接的时候,点后面是没有内容的,猜测是这样的用法,具体是否是这样还需要验证。