目标

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. learning java AWT 绝对定位

    import javax.swing.*; import java.awt.*; public class NullLayoutTest { Frame f = new Frame("测试窗 ...

  2. 洛谷 P2894 [USACO08FEB]酒店

    题目描述 用线段树维护三个值:区间最长空位长度,从左端点可以延伸的最长空位长度,从右端点可以延伸的最长空位长度. #include<complex> #include<cstdio& ...

  3. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...

  4. cgp的辣鸡比赛题解

    目录 cgp的gcd 题目链接 思路 代码 cgp调戏妹子 题目链接 思路 代码 cgp的序列 题目链接 思路 代码 cgp的背包 题目链接 思路 代码 cgp的gcd 题目链接 传送门 思路 首先看 ...

  5. ehcache.xml 配置文件备忘录(不建议出现中文注释,此处备忘)

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLoc ...

  6. nodejs新工具-cypress和testcofe的崛起

    今天咨询一个自动化 工具问题,偶然间有人提起了这个可能以后会很火的工具,在此找到一篇很好的参考文章 记录并为以后做准备 cypress和testcofe https://www.jianshu.com ...

  7. mysql in()后子查询优化

    线上数据发现一条数据大量等待的现象,通过explain发现这个sql写法存在问题,这里简单记录一下. 业务场景是这样: 存在购物车和费用两张表,购物车数据是购买商品时生成,用于记录购买商品数据,同时购 ...

  8. RHEL7下载

    RHEL7下载地址: http://mirrors.aliyun.com/centos/ 我的百度云盘地址: 链接:https://pan.baidu.com/s/1_-bm12bekFlWJiGHj ...

  9. [Shell]利用JS文件反弹Shell

    0x01 模拟环境 攻击: kali ip: 192.168.248.132 测试: windows 7 x64 ip: 192.168.248.136 0x02 工具地址 https://githu ...

  10. dhcp自动分配地址