Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58478
  • 博文数量: 9
  • 博客积分: 226
  • 博客等级: 二等列兵
  • 技术积分: 131
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-22 22:43
文章分类

全部博文(9)

文章存档

2013年(2)

2012年(7)

我的朋友

分类: 嵌入式

2012-09-04 17:57:02

                                     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) |
给主人留下些什么吧!~~