目标

GStreamer提供了一系列方便使用的工具。这篇教程里不牵涉任何代码,但还是会讲一些有用的内容:

如何在命令行下建立一个pipeline——完全不使用C

如何找出一个element的Capabilities

如何发现一个媒体文件的内部结构

介绍

这些工具就位于SDK的bin目录下。你需要把这个目录加入PATH变量,或者把当前目前切换到GStreamer SDK的bin目录。

打开一个终端界面,把当前目录切换到GStreamer SDK的bin目录,然后准备跟着我们操作吧。

为了防止多个版本的GStreamer都安装导致的冲突,所有的工具都是有版本的,他们的名字后面跟着GStreamer的版本号。因为这个版本的SDK是0.10,所以工具就是gst-launch-0.10、gst-inspect-0.10和gst-discoverer-0.10。

gst-launch

这个工具可以创建一个pipeline,初始化然后运行。它可以让你在正式写代码实现pipeline之前先快速测试一下,看看是否能工作。

请记住这个工具只能建立简单地pipeline。尤其是,它只能在一个特定层级之上模拟pipeline和应用的交互。在任何情况下,它都可以很简单的快速测试pipeline,全世界的GStreamer的开发者每天都在使用它。

请注意,gst-launch对于开发者来说主要是一个调试工具。你不应该基于它开发应用,而应该使用gst_parse_launch()这个API来创建pipeline。

虽然构造pipeline的描述是非常简单地事情,但多个element的连接也很快能让事情变得超越你的想象。不过别怕,最后每个人都能学会gst-launch的语法。

gst-launch的命令行包括一个在PIPELINE-DESCRIPTION之后的一系列选项。有些简单地指令在下面会讲到,在gst-launch的描述文档上可以看到所有的相关内容。

elements

简单来说,一个PIPELINE-DESCRPTION是一系列用!分隔开的元素,试一下下面的命令:

[objc] view
plain
 copy

  1. .10 videotestsrc ! ffmpegcolorspace ! autovideosink

你可以看见一个带动画视频窗口。使用CTRL+C可以终止运行。

这个例子用了videotestsrc,ffmpegcolorspace和autovideosink三个element。GStreamer会把他们的输出pad和输入pad连接起来,如果存在超过1个可用的输入/输出pad,那么就用pad的Caps来确定兼容的pad。

属性

element可能是有属性的,在命令行里格式就是“属性=值”,多个属性用空格来分开。可以用gst-inspect工具来查一下element的属性(这个工具下面会讲到)。

[objc] view
plain
 copy

  1. .10 videotestsrc pattern=11 ! ffmpegcolorspace ! autovideosink

你可以看见一个静态的一系列同心圆的图像。

带名字的element

element可以用name这个属性来设置名称,这样一些复杂的包含分支的pipeline可以创建了。有了名字,就可以使用前面创建的element,这在使用有多个pad的element(比如demuxer或者tee等)时是必不可少的。

带名字的element在使用名字时需要在后面加一个点。

[objc] view
plain
 copy

  1. .10 videotestsrc ! ffmpegcolorspace ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink

你可以看见两个视频窗口,显示同样的内容。如果你只看到了一个,试着挪动一些窗口位置,可能另一个被压住了。

这个例子中把videotestsrc先连接了ffmpegcolorspace,然后连接了tee element(在《GStreamer基础教程07——多线程和pad的有效性》里提到过),这个tee就被命名成‘t’,然后一路输出到queue以及autovideosink,另一路输出到另一个queue和autovideosink。

queue在这里是必须的,原因参见《GStreamer基础教程07——多线程和pad的有效性》。

Pads

在连接两个element时与其让GStreamer来选择哪个Pad,我们宁可直接指定Pad。我们可以在命名element后使用.+pad名字的方法来做到这点(element必须先命名)。同样可以用gst-inspect来查看element里面pad的名字。

[objc] view
plain
 copy

  1. .10.exe souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux name=d d.video_00 ! matroskamux ! filesink location=sintel_video.mkv

这个命令使用souphttpsrc在internet上锁定了一个媒体文件,这个文件是webm格式的。我们可以用matroskademux来打开这个文件,因为媒体包含音频和视频,所以我们创建了两个输出Pad,名字分别是video_00和audio_00。我们把video_00和matroskamux
element连接起来,把视频流重新打包,最后连接到filesink,这样我们就把流存到了一个名叫sintel_video.mkv的文件。

总之,我们找了一个webm文件,去掉了声音,仅把视频拿出来存成了一个新文件。如果我们像保持声音,那么就应该这样做:

[objc] view
plain
 copy

  1. .10.exe souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux name=d d.audio_00 ! vorbisparse ! matroskamux ! filesink location=sintel_audio.mka

这里的vorbisparse element会从流里面取出一些信息,然后放到Pad的Caps里面,这样下一个element,也就是matroskamux就可以知道如何处理这个流了。这个处理在抓取视频的时候是不用做的,因为matroskademux已经做了这件事情。

请注意,在上面的两个例子中,媒体没有被解码和播放。我们仅仅只是把数据搬动了一下而已。

Caps过滤

当一个element有不止一个pad时,连接下一个element可能是模糊不清的,因为下游的element可能有不止一个的兼容的输入pad,或者它的输入pad可以和所有的输出pad兼容。在这样的情况下,GStreamer会使用第一个可以连接的Pad,这样相当于说GStreamer是随机找一个pad来连接的。

看一下下面的pipeline:

[objc] view
plain
 copy

  1. .10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux ! filesink location=test

这里和上一个例子用了同样的媒体文件和demuxer。finksink输入pad是任意格式,这意味着它可以接受所有的媒体格式。那么matroskademux的哪个pad可以接到filesink呢?video_00还是audio_00?我们无法知道。

为了消除这种不确定性,前面例子中我们用了pad的名字的方法,这里介绍使用Caps过滤的方法:

[objc] view
plain
 copy

  1. .10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux ! video/x-vp8 ! matroskamux ! filesink location=sintel_video.mkv

一个Caps过滤动作类似于让element不做任何动作,仅仅接受给出的Caps。在这个例子中,在matroskademux和matroskamux中间我们加入了一个ievideo/x-vp8的Caps过滤,这样就表明在matroskademux中我们仅仅需要能生成这种类型视频的输出Pad。

我们需要用gst-inspect工具来查看一个element能接受和生成的Caps,用gst-discoverer来查看文件里面包含的Caps。如果我们需要查看在pipeline里面一个element生成的Caps,在gst-launch里面使用-v参数即可。

例子

用playbin2播放一个媒体文件(和《GStreamer基础教程01——Hello
World
》一样)

[objc] view
plain
 copy

  1. .10 playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm

一个正常的播放pipeline。

[objc] view
plain
 copy

  1. .10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! matroskademux name=d ! queue ! vp8dec ! ffmpegcolorspace ! autovideosink d. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink

一个转码的pipeline,解析webm之后把所有的流解码,重新把音视频编码成其他格式,然后压成Ogg文件。

[objc] view
plain
 copy

  1. .10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm name=d ! queue ! theoraenc ! oggmux name=m ! filesink location=sintel.ogg d. ! queue ! audioconvert ! audioresample ! flacenc ! m.

一个调整视频比例的pipeline。videoscale element可以调整输入尺寸然后再输出。例子里面用Caps过滤设置了视频大小为320x200:

[objc] view
plain
 copy

  1. .10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! queue ! videoscale ! video/x-raw-yuv,width=320,height=200 ! ffmpegcolorspace ! autovideosink

get-launch简单介绍大致就这些内容了,这可以作为一个很好的起点。如果你需要更多的信息,请猛戳这里

gst-inspect

这个工具有三种操作:

不带参数,它会列出所有可用的element,也就是你所有可以使用的元素

带一个文件名,它会把这个文件作为GStreamer的一个插件,试着打开,然后列出内部所有的element

带一个GStreamer的element,会列出该element的所有信息

让我们看一个例子:

[objc] view
plain
 copy

  1. .10 vp8dec
  2. Factory Details:
  3. VP8 Decoder
  4. Class:        Codec/Decoder/Video
  5. video streams
  6. Author(s):    David Schleef <ds@entropywave.com>
  7. 56)
  8. Plugin Details:
  9. plugin
  10. 012.5\x86\lib\gstreamer-0.10\libgstvp8.dll
  11. .10.23
  12. License:              LGPL
  13. Source module:        gst-plugins-bad
  14. 012-02-20
  15. Binary package:       GStreamer Bad Plug-ins (GStreamer SDK)
  16. Origin URL:           http://www.gstreamer.com
  17. GObject
  18. +----GstObject
  19. +----GstElement
  20. +----GstBaseVideoCodec
  21. +----GstBaseVideoDecoder
  22. Dec
  23. Pad Templates:
  24. SRC template: 'src'
  25. Availability: Always
  26. Capabilities:
  27. video/x-raw-yuv
  28. 20
  29. , 2147483647 ]
  30. , 2147483647 ]
  31. /1, 2147483647/1 ]
  32. SINK template: 'sink'
  33. Availability: Always
  34. Capabilities:
  35. Element Flags:
  36. no flags set
  37. Element Implementation:
  38. Has change_state() function: gst_base_video_decoder_change_state
  39. Has custom save_thyself() function: gst_element_save_thyself
  40. Has custom restore_thyself() function: gst_element_restore_thyself
  41. Element has no clocking capabilities.
  42. Element has no indexing capabilities.
  43. Element has no URI handling capabilities.
  44. Pads:
  45. SRC: 'src'
  46. Implementation:
  47. Has custom eventfunc(): gst_base_video_decoder_src_event
  48. Has custom queryfunc(): gst_base_video_decoder_src_query
  49. Provides query types:
  50. ):    position (Current position)
  51. ):    duration (Total duration)
  52. ):    convert (Converting between formats)
  53. Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
  54. Has getcapsfunc(): gst_pad_get_fixed_caps_func
  55. Has acceptcapsfunc(): gst_pad_acceptcaps_default
  56. Pad Template: 'src'
  57. SINK: 'sink'
  58. Implementation:
  59. Has chainfunc(): gst_base_video_decoder_chain
  60. Has custom eventfunc(): gst_base_video_decoder_sink_event
  61. Has custom queryfunc(): gst_base_video_decoder_sink_query
  62. Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
  63. Has setcapsfunc(): gst_base_video_decoder_sink_setcaps
  64. Has acceptcapsfunc(): gst_pad_acceptcaps_default
  65. Pad Template: 'sink'
  66. Element Properties:
  67. name                : The name of the object
  68. flags: readable, writable
  69. String. Default: "vp8dec0"
  70. post-processing     : Enable post processing
  71. flags: readable, writable
  72. Boolean. Default: false
  73. post-processing-flags: Flags to control post processing
  74. flags: readable, writable
  75. x00000003, "demacroblock+deblock"
  76. x00000001): deblock          - Deblock
  77. x00000002): demacroblock     - Demacroblock
  78. x00000004): addnoise         - Add noise
  79. deblocking-level    : Deblocking level
  80. flags: readable, writable
  81. - 16 Default: 4
  82. noise-level         : Noise level
  83. flags: readable, writable
  84. - 16 Default: 0

这里最重要的是 :

Pad Templates:这部分会列出所有的Pad的种类以及它们的Caps。通过这些你可以确认是否可以和某一个element连接。这个例子中,只有一个sink的Pad Template,只能接受video/x-vp8(用VP8格式来编码视频数据)格式;只有一个source的Pad Template,生成video/x-raw-yuv。

element的属性:这里列出了element的所有的属性以及有效值。

更多信息请查看gst-inspect的文档。

gst-discoverer

这个工具是对GstDiscoverer对象的一个包装。它可以接受从命令行输入的一个URI,然后打印出所有的信息。这个在查看媒体是如何编码如何复用时是很有用的,这样我们可以确定把什么element放到pipeline里面。

使用gst-discoverer --help来获得帮助。

让我们看个例子:

[objc] view
plain
 copy

  1. .10 http://docs.gstreamer.com/media/sintel_trailer-480p.webm -v
  2. Analyzing http://docs.gstreamer.com/media/sintel_trailer-480p.webm
  3. Done discovering http://docs.gstreamer.com/media/sintel_trailer-480p.webm
  4. Topology:
  5. container: video/webm
  6. , rate=(int)48000
  7. Codec:
  8. , rate=(int)48000
  9. Additional info:
  10. None
  11. Language: en
  12. 8000
  13. 0000
  14. Tags:
  15. theora-0.24, encoder=(string)"Xiph.Org\ libVorbis\ I\ 20090709", encoder-version=(uint)0, nominal-bitrate=(uint)80000, bitrate=(uint)80000;
  16. , width=(int)854, height=(int)480, framerate=(fraction)25/1
  17. Codec:
  18. , width=(int)854, height=(int)480, framerate=(fraction)25/1
  19. Additional info:
  20. None
  21. 54
  22. 80
  23. 5/1
  24. /1
  25. Interlaced: false
  26. Tags:
  27. taglist, video-codec=(string)"VP8\ video", container-format=(string)Matroska;
  28. Properties:
  29. 0:52.250000000
  30. Seekable: yes
  31. Tags:
  32. VP8
  33. language code: en
  34. container format: Matroska
  35. theora-0.24
  36. 0090709
  37. audio codec: Vorbis
  38. 0000
  39. 0000

【GStreamer开发】GStreamer基础教程10——GStreamer工具的更多相关文章

  1. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一)   平台简单介绍   令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...

  2. 【GStreamer开发】GStreamer基础教程02——GStreamer概念

    上一个教程演示了如何自动生成一个pipeline.这次我们打算用一个个element来手动搭建一个pipeline.我们这个教程会演示: 1. 什么是GStreamer的element以及如何建立一个 ...

  3. PHP基础教程 10款人气暴涨的PHP开源工具

    若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发 人员,减轻他们的开 ...

  4. Gstreamer基础教程10 - Streaming

    摘要 我们把直接从网络播放一个媒体文件的方式称为在线播放(Online Streaming),我们已经在以往的例子中体验了GStreamer的在线播放功能,当我们指定播放URI为 http:// 时, ...

  5. 【Gstreamer开发】TI嵌入式处理器GStreamer pipeline

    Example GStreamer Pipelines From Texas Instruments Embedded Processors Wiki Jump to: navigation, sea ...

  6. Java基础教程(10)--类

    一.声明类   你已经见过了以如下方式定义的类: class MyClass { // field, constructor, and method declarations }   上面是声明类的最 ...

  7. cocos基础教程(10)纹理缓存技术

    Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理. 当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法 ...

  8. iOS开发零基础教程之生成git所需的SSH keys

    在我们github看到了一个不错的第三方库时,可能我们想把他git clone到本地,我们需要复制他的SSH URL,如下图: 复制完地址之后,我们需要打开终端,然后输入命令: git clone + ...

  9. 【GStreamer开发】GStreamer基础教程14——常用的element

    目标 本教程给出了一系列开发中常用的element.它们包括大杂烩般的eleemnt(比如playbin2)以及一些调试时很有用的element. 简单来说,下面用gst-launch这个工具给出一个 ...

随机推荐

  1. Shell脚本之sed的使用

    1.sed命令:主要作用是查找:新增 删除 和修改替换. user.txt daokr#cat user.txt ID Name Sex Age zhang M wang G cheng M huah ...

  2. noi.ac #30 思维

    \(des\) 给定升序数组 \(A, B\) 对于任意两个集合 \(a, b\) 分别是 \(A, B\) 的子集,总价值为较小的集合的和, 总代价为 \((|a| + |b|) \times w\ ...

  3. 2017.10.3 国庆清北 D3T1 括号序列

    题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的括号序列. 若A是合法的括号序列,则(A)是合法的括号序列. 若A和B分别是合法的括号序列,则AB是合法的 ...

  4. COGS 2687 讨厌整除的小明

    二次联通门 : COGS 2687 讨厌整除的小明 /* cogs 2687 讨厌整除的小明 打表出奇迹.. 考场时看了一下样例就感觉有非常鬼畜的做法.. 手搞几组数据做法就出来了... 2333 * ...

  5. 和小哥哥一起刷洛谷(6) 图论之SPFA算法

    关于\(spfa\) spfa伪代码: void spfa(s){ 最短路数组全部设为无限大; 队列 q; 起点s入队; s离s的距离设为零; while(队列非空){ 取出队首;弹出队首; for( ...

  6. SQL Server 静默安装

    SQL Server 安装时,需要在各个安装窗口进行选择和设置,若需要在多台服务器安装相同的数据库,静默安装是比较省事的. 当安装 SQL Server  到最后一步,会有一个安装配置文件 Confi ...

  7. Unity3D地下守护神ARPG开发三部曲 视频教程+素材+源码

    通过大型教学项目“MMOARPG地下守护神”项目的学习,掌握常用设计模式.架构设计.各种重要算法与设计模式在项目中的灵活运用,学后达到中高级游戏研发人员水平,做主程必备. 适用人群    学习Unit ...

  8. gstreamer的gst-inspect 和gst-launch

    用gstreamer架构做对媒体开发时,gst-inspect 和gst-launch是两个非常使用的小工具,前者是用于查询库中已经包含的所有element以及他们的详细信息,后者用于快速构建一条pi ...

  9. Android常用优秀开源框架

    Android常用优秀开源框架 https://github.com/Ericsongyl/AOSF AOSF:全称为Android Open Source Framework,即Android优秀开 ...

  10. SHELL/VIM删除重复行(去重)text handle

    vim 删除重复行 - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=vim+%E5%88%A0%E9%99%A4% ...