Gstreamer 提供的各种工具
这篇文章主要介绍Gstreamer提供的各种工具和LOG系统。
对于Gstreamer提供的各种工具,将按照linux man page的方式进行书写。
gst-launch 命令
gst-launch - 创建和运行一条pipeline
Synopsis
gst-launch [OPTION...] PIPELINE-DESCRIPTION
Notice
gst-launch命令是提供给用户的调试工具,不要在应用程序里直接调用gst-launch命令,gstreamer提供了API:
gst_parse_launch()供应用程序调用,该API根据输入的pipeline-description为用户创建pipeline(gst-launch在内
部也是调用这个API来创建pipeline);
Options
--help 这个不用解释了吧;
-v, --verbose 打印pipeline的一些运行时信息, 例如caps的值, property的值,elements, state等等;
-q, --quiet 不打印任何LOG;
-m, --messages 打印pipeline的bus上的一些message,例如EOS;
-t, --tags 打印metadata相关的信息,例如专辑名,风格之类的;
-o FILE, --output=FILE 将pipeline的结构以XML表的形式存到文件"FILE"中;
-f, --no_fault 如果设置了该参数,gst-launch将不会捕捉SIGSEGV和SIGQUIT信号;
-T, --trace 打印gst-launch在创建pipeline的时候动态分配的一些对象的地址;
Gstreamer Options
--gst-version 打印gstreamer core的版本;
--gst-fatal-warnings 在pipeline出现warning的时候,会导致程序abort;
--gst-debug=STRING
gstreamer的log可以按照类别和等级进行打印,STRING就是由“category_name : level”这种二元组的列表组成,
多个二元组用逗号分开;用--gst-debug-help查询所有的category_name的信息,可以用通配符‘*’来指定多个
category name; level的值根据gstreamer版本的有所不同,例如gstreamer 0.10.36支持0~7,其中0不会打印任何
信息,7将打出来所有的信息;例如,--gst-debug=GST_ELEMENT_*:3,oggdemux:5 表示将category name中带
有”GST_ELEMENT_”字符串并且level等级小于等于3的LOG全部打印出来,同时还将category name是
oggdemux并且level小于等于5的LOG全部打印出来;
--gst-debug-level=LEVEL,
不区分category,将所有的等级小于等于LEVEL的log全部打印出来。 0.10.36 LEVEL的取值范围是0~7;
--gst-debug-no-color,
gstreamer默认输出的Log按照等级不同区分颜色,设置该参数则不区颜色,这样对不支持颜色字符的终端就不会输出乱
七八糟的框框;
--gst-debug-disable, 禁用debug功能;
--gst-debug-help, 打印所有的category_name 以及默认的等级;
--gst-plugin-spew, 输出一些加载gstreamer插件的时候的错误信息;
--gst-plugin-path=PATH,设置插件查找的路径,多个路径用“:“分开;
--gst-plugin-load=PLUGINS, 指定需要预加载的插件(目前没有用上过)
Pipeline Description
Pipeline description由elements, bins, caps, links组成,用来指定Pipeline的组织形式。Pipeline description既可
以用来传递给gst-launch,也可以传递给gst_parse_launch()函数。
Elements
ELEMENT_TYPE [PROPERTY1 ...]
Creates an element of type ELEMENT_TYPE and sets the PROPERTIES
可以用gst-inspect命令来查看一个element支持哪些property,每个 property的类型以及默认值等。所有的
property都用 PROPERTY= VALUE的格式赋值,多个property之间用空格分开即可, 例如:
gst-launch-0.10 filesrc location=MPEG4_V_ONLY.avi ! decodebin2 ! ffmpegcolorspace ! autovideosink
其中黑体字表示创建一个filesrc类型的element,并且给“location”这个property赋值。
Bins
[BINTYPE.] ( [PROPERTY1 ...] PIPELINE-DESCRIPTION )
创建BINTYPE类型的bin,同时给该bin设置一些property,小括号中的pipeline-description用来说明该bin内部结构
以及bin内部各个elements是如何连接的,请注意BINTYPE后面有个点号,在gst-launch命令中基本上用不到Bins,
在写自己的APP的时候,可以将Bins传递给gst_parse_launch函数,这样gst_parse_launch将为你创建一个Bin而
不是Pipeline.
Links
Link用来说明如何连接两个element,Link的格式比较复杂,因此我从最简单的格式开始讲:
1, link只包含 " !",既下面的范式所示
SRC_ELEMENT_TYPE [PROPERTY1... ] ! SINK_ELEMENT_TYPE [PROPERTY1...]
SRC_ELEMENT_TYPE [PROPERTY1... ] 和SINK_ELEMENT_TYPE [PROPERTY1...]按照上面关于Elements介
绍的方式书写即可,例如:
gst-launch filesrc location=music.mp3 ! filesink location=music.mp3.bak
2,link包含" !" 和element name,既下面的范式所示
[[SRC_ELEMENT_NAME].] ! [[SINK_ELEMENT_NAME].]
Links the element with name SRC_ELEMENT_NAME to the element with name
SINK_ELEMENT_NAME,SRC_ELEMENT_NAME和SINK_ELEMENT_NAME是在创建element的时候通过
name property指定的,注意NAME后面的点号!例如:
gst-launch filesrc name=filesrc1 location=music.mp3 filesrc1. ! filesink1. filesink name=filesink1 location=music.mp3.bak
这个命令在开始的时候创建了一个filesrc插件,并且命名为filesrc1,这样我们就可以用filesrc1来建立连接,对比第一
个例子和第二个例子,不难看出第一个范式是第二个范式的退化形式,是不是觉得范式二是多余的?但是并不是所有的
element都像filesrc和filesink这么简单,这两个element每次都仅仅连接一个element。但是像demux, mux,
tee,textoverlay,multiqueue,inputselector等等很多element同时需要连接好几个其它的elemenet。这样范式
一就没有办法工作了,因为范式一每次都是创建新的element,范式二不会创建新的element。例如:
gst-launch filesrc location=movie.mpg ! mpegdemux name=demuxer demuxer. ! queue ! mpeg2dec !
ffmpegcolorspace ! sdlvideosink demuxer. ! queue ! mad ! audioconvert ! audioresample ! osssink
这个命令用来播放一个既有音频又有视频的多媒体文件,一路用来播放video,一路用来播放audio。
我们将上面的pipeline description拆成三段就非常好理解了:
创建filesrc和mpegdemux,并且给demux命名为demuxer
filesrc location=movie.mpg ! mpegdemux name=demuxer
创建播放video的一系列的element,然后按照范式二,将这些element连接到demuxer上;
demuxer. ! queue ! mpeg2dec ! ffmpegcolorspace ! sdlvideosink
创建播放audio的一系列的element,然后按照范式二,将这些element连接到demuxer上;
demuxer. ! queue ! mad ! audioconvert ! audioresample ! osssink
3,link包含" !",element name, pad name既下图所示范式
[[SRC_ELEMENT_NAME].[PAD1_NAME,...]] ! [[SINK_ELEMENT_NAME].[PAD1_NAME,...]]
跟第二个范式类似,只不过显示的指定了element的PAD_NAME,PAD_NAME可以通过gst-inspect查看。一般情况
下我们都不需要指定PAD_NAME, 如果PAD_NAME没有指定,gst-launch会比对link两边的element的所有的
pad,如果找到可以匹配的PAD则连接成果,否则会报Internal data error,例如:
gst-launch textoverlay name=overlay ! ffmpegcolorspace ! videoscale ! autovideosink filesrc location=movie.avi ! decodebin2 ! ffmpegcolorspace ! overlay.video_sink filesrc location=movie.srt !
subparse ! overlay.text_sink
textoverlay插件对video和字幕进行mix,然后输出到一个videosink插件中,我们可以将上面的pipeline
description拆成下面的三段:
创建textoverlay并命名,然后按照范式二连接到实际的videosink;
textoverlay name=overlay ! ffmpegcolorspace ! videoscale ! autovideosink
按照范式三将ffmpegcolorspace连接到overlay的video_sink pad上,
filesrc location=movie.avi ! decodebin2 ! ffmpegcolorspace ! overlay.video_sink
按照范式三将subparse连接到overlay的text_sink pad上。
filesrc location=movie.srt ! subparse ! overlay.text_sink
上面的pipeline没有将播放audio 的path加上,如果你完全读懂了这篇blog,应该能够自己加上audio path。
Caps
MIMETYPE [, PROPERTY[, PROPERTY ...]]] [; CAPS[; CAPS ...]]
Caps用来指定两个element之间传输数据的类型,一般都不需要指定,关于CAPS这一部分linux man page说的非常详
细,在这里我就不说了,详细请参考:
至此gst-launch命令全部说完,下一节说gst-inspect。
阅读(3680) | 评论(0) | 转发(1) |