原文来自:
// 名词解释
元件(Elements)
// 元件(element)是 GStreamer 中最重要的概念。
// 你可以通过创建一系列的元件(Elements),并把它们连接起来
// 从而让数据流在这个被连接的各个元件(Elements)之间传输
箱柜(Bins)
// 箱柜(Bins)是一个可以装载元件(element)的容器。
// 管道(pipelines)是箱柜(Bins)的一个特殊的子类型,
// 管道(pipelines)可以操作包含在它自身内部的所有元件(element)。
// 因为箱柜(Bins)本身又是元件(element)的子集
// 所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins),
// 通过这种方法可以降低你的应用程序的复杂度。
// 你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态。
// 箱柜(Bins)可以发送总线消息(bus messages)给它的子集元件(element)
// (这些消息包括:错误消息(error messages),标签消息(tag messages),EOS 消息(EOS messages))
管道(pipelines)
// 管道(pipeline)是高级的箱柜(Bins)。
// 当你设定管道的暂停或者播放状态的时候,数据流将开始流动,并且媒体数据处理也开始处理。
// 一旦开始,管道将在一个单独的线程中运行,直到被停止或者数据流播放完毕。
衬垫(Pads)
// 衬垫(Pads)在 GStreamer 中被用于多个元件的链接,从而让数据流能在这样的链接中流动。
// 一个衬垫(Pads)可以被看作是一个元件(element)插座或者端口, 元件(element)之间的链接就是依靠着衬垫(Pads)。
// 衬垫(Pads)有处理特殊数据的能力: 一个衬垫(Pads)能够限制数据流类型的通过。
// 链接成功的条件是:只有在两个衬垫(Pads)允许通过的数据类型一致的时候才被建立。
// 数据类型的设定使用了一个叫做 caps negotiation 的方法。数据类型被为一个 GstCaps 变量所描述。
总线(Bus)
// 总线是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中。
// 总线的优势是:当使用 GStreamer 的时候,应用程序不需要线程识别,即便 GStreamer 已经被加载了多个线程
// 每一个管道默认包含一个总线,所以应用程序不需要再创建总线。
// 应用程序只需要在总线上设置一个类似于对象的信号处理器的消息处理器。
// 当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务
消息类型(Message types)
// GStreamer 有几种由总线传递的预定义消息类型,这些消息都是可扩展的。
// 插件可以定义另外的一些消息,应用程序可以有这些消息的绝对代码或者忽略它们。
// 强烈推荐应用程序至少要处理错误消息并直接的反馈给用户
// 便携元素(常用的Element)
// 这些是 Bin element,它们在内部包含其他的element,已经组成了内部的pipeline,但在外部,我们还是把它们当成一个element
playbin、playbin2
// 这个 Element 在整个系列的教程里面广泛的被使用了。
// 它会处理播放的方方面面,从源经过解复用、解码到最后的显示。
// 同时它也非常灵活,有很多设置项,在后面有教程会更详细的讲述到。
uridecodebin
// 这个 Element 从一个URI获得数据然后解码成原始媒体数据。
// 它会选择一个能处理给定的URI的source element,然后和decodebin2连接起来。
// 它在一个媒体里面发现多少流就提供多少source pad来输出,这点和解复用很像。
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/sintel_trailer-480p.webm ! videoconvert ! autovideosink
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink
decodebin2、decodebin2
// 这个 Element 会自动用解复用插件和解码插件创建解码pipeline
// 它被使用起来更方便的 uridecodebin 作为一个source element集成在自己内部了。
// 以前还有一个旧的decodebin,目前已经废弃不用了。
// 和uridecodebin一样,它也是在媒体里面发现多少流就提供多少source pad来输出。
gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! autovideosink
// 文件输入/输出
filesrc
// 这个 Element 会读取一个本地文件然后用Caps来输出媒体数据。
// 如果你想要获得一个正确地Caps,那么需要用typefind element来搜索流或者把filesrc的typefind属性设置成TRUE。
gst-launch-0.10 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin2 ! autovideosink
filesink
// 这个 Element 会把所有收到的媒体数据存成文件。使用location属性来指定路径和文件名。
gst-launch-0.10 audiotestsrc ! vorbisenc ! oggmux ! filesink location=test.ogg
// 网络
souphttpsrc
// 这个 Element 作为一个客户端,使用SOUP库经由HTTP来接收数据。通过location属性来设置URL。
gst-launch-0.10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! autovideosink
// 测试媒体数据生成
// 这些 Element 在测试 pipeline 是否工作时是非常有用的,它们是确保可以工作生成数据的,所以可以取代数据源。
videotestsrc
// 这个 Element 生成一个固定的video输出(通过pattern属性来设置),用来测试视频的pipeline。
gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! autovideosink
audiotestsrc
// 这个 Element 生成一个音频信号(通过设置wave属性来设置),用来测试音频的pipeline。
gst-launch-0.10 audiotestsrc ! audioconvert ! autoaudiosink
// 视频适配
ffmpegcolorspace
// 这个 Element 会把一个色彩空间转换到另一个色彩空间(比如从RGB转到YUV)。它也可以在转换不同的YUV格式或者RGB格式。
gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! autovideosink
videorate
// 这个 Element 接受带时间戳的视频数据转换成匹配source pad帧率的流。
// 通过丢弃或者复制帧来执行改正,而不是通过古怪的算法。
// 这个在连接不同帧率的 Element 时很有用。
// 正如其他的适配插件,如果不需要的话会直通过去(上下游element能匹配上)。
// 如果实际帧率未知的情况下,为了以防万一,使用这个element是个不错的主意。
gst-launch-0.10 videotestsrc ! video/x-raw-rgb,framerate=30/1 ! videorate ! video/x-raw-rgb,framerate=1/1 ! ffmpegcolorspace ! autovideosink
videoscale
// 这个 Element 可以修改视频帧的尺寸。
// 这个 Element 会先检查不修改视频尺寸是否可行,如果可行,就不在进行尺寸的转换。
// 这个 Element 支持很多色彩空间,包括不同的YUV和RGB格式。而且可以放在pipeline的任何地方。
// 如果视频是往一个用户控制的窗口输出时,加上videoscale这个element是个好主意,因为并不是所有的视频输出都是支持缩放的。
gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw-yuv,width=178,height=100 ! ffmpegcolorspace ! autovideosink
// 音频适配
audioconvert
// 这个 Element 会转化原始的不同音频格式之间的缓冲。
// 它支持从整数到浮点数的转化,符号数/字节序转换以及声道转换。
gst-launch-0.10 audiotestsrc ! audioconvert ! autoaudiosink
audioresample
// 这个 Element 使用可配置的窗口函数重采样音频缓冲到不同的采样率来增强质量。
gst-launch-0.10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! audioresample ! audio/x-raw-float,rate=4000 ! audioconvert ! autoaudiosink
audiorate
// 这个 Element 接受带时间戳的音频帧,然后通过增加或者降低采样来获得一个标准流。
// 它不能修改采样率,只能通过移除重叠部分和填充空白部分来获得连续“干净”的输出。
// 当时间戳丢失接收器要求所有的采样同时渲染时这个element比较有用。
// 大多数时候,audiorate这不是您想要的。
// 多线程
queue
// Queue 已经在《GStreamer基础教程07——多线程和Pad的有效性》里面介绍过了。
// 基本上,一个 queue 执行两个任务:数据可以一直放进队列直到满为止
// Queue 会给source pad创建一个新的线程,这样就可以解耦对于sink和source pad的处理
// 另外,Queue 在变空或满的时候会触发信号,可以抛弃一些缓冲数据来避免阻塞。
// 如果你不面临网络缓冲的困境,那么使用更简单的queue element而不是queue2,
// 具体例子同样参考《GStreamer基础教程07——多线程和Pad的有效性》
queue2
// 这个 Queue2 Element 不是 Queue 的进化版本。
// 它和queue有同样地设计目标,但实现方法不同,这也导致了一些功能不太一致。不幸的是,通常来说很难说孰优孰劣。
// Queue2 同样执行了上面列出的queue的两个任务,此外,还可以把收到的数据存在硬盘上。
// 它同时用更通用更方便的缓冲消息来取代了空/满这些信号,这个缓冲消息在《GStreamer基础教程12——流》里面描述过了。
// 当涉及到网络缓冲时,请使用queue2而不是queue。请参考《GStreamer基础教程12——流》。
multiqueue
// 这个 Element 可以对多个流同时提供 Queue,并且简化对流的管理。
// 此外,它可以同步不同的流,确保任何一个流都不会运行的特别快。
// 这是一个先进的 Element。
// decodebin2里面包含着这个 Element,你在一个通常的播放应用里面很少会直接使用。
tee
// 在《GStreamer基础教程07——多线程和Pad的有效性》这篇里面,我们已经演示了如何使用tee这个element。
// 把数据分成相同的多份是非常有用的,比如,可以同时在屏幕上播放图像和保存文件到硬盘。
// 在每个分支上使用独立的playbin2 element,提供相互独立的线程。否则一旦数据在一个分支上阻塞了,那么其它分支也会停止。
gst-launch-0.10 audiotestsrc ! tee name=t ! queue ! audioconvert ! autoaudiosink t. ! queue ! wavescope ! ffmpegcolorspace ! autovideosink
// 能力
capsfilter
// 在《GStreamer基础教程10——GStreamer工具》里面已经解释了gst-launch怎么使用Caps过滤。
// 当我们编程实现一个pipeline时,Caps过滤通常用capsfilter这个element来实现。
// 这个element不会修改数据,但会限制数据的类型。
gst-launch-0.10 videotestsrc ! video/x-raw-gray ! ffmpegcolorspace ! autovideosink
typefind
// 这个 Element 决定了一个流所包含的媒体的类型。它按照他们的等级调用typefind函数。
// 一旦检测到,它就会把source pad设置成发现的媒体类型,然后发出have-type信号。
// decodebin2这个element内部就包含了typefind,虽然我们通常是使用GstDiscoverer来获得更多地信息,但你也可以用这个element来确定媒体类型。
// 调试
fakesink
// 这个 sink element 仅仅简单的抛弃所有输入的数据。
// 在调试过程中它是很有用的,你可以用它来取代你想使用的sink来确保不会出现意外。
// 它在gst-lauch命令行并出现-v参数后会显得非常冗余,如果你觉得无用信息太多,那么可以设置silent属性。
gst-launch-0.10 audiotestsrc num-buffers=1000 ! fakesink sync=false
identity
// 这是一个哑巴 Element 仅仅把输入数据不加修改的传过来。
// 它也有一些有用的调试函数,例如偏移量和时间戳检测,或者丢弃缓冲。
// 想要进一步了解请阅读它的文档。
gst-launch-0.10 audiotestsrc ! identity drop-probability=0.1 ! audioconvert ! autoaudiosink
// 平台相关的 Element
// 跨平台
glimagesink
// 该视频接收器基于 OpenGL或OpenGL ES。
// 它支持缩放图像的重新缩放和过滤,以减轻锯齿。
// 它实现了VideoOverlay接口,因此可以重新设置视频窗口的父级(嵌入在其他窗口中)。
// 这是大多数平台上推荐的视频接收器。
// 特别是在Android和iOS上,它是唯一可用的视频接收器。
// 可以将其分解为 glupload ! glcolorconvert ! glimagesinkelement 将进一步的OpenGL硬件加速处理插入到管道中。
// Linux
ximagesink
// 标准的基于X系统的视频sink。它实现了XOverlay接口,所以视频窗口可以嵌入其他窗口。
// 它不支持视频缩放,需要实现这个功能必须使用其他的方法(比如videoscale element)。
xvimagesink
// 一个基于X系统的视频sink,使用了XVideo_Extension(Xv)方法。
// 它实现了XOverlay接口,所以视频窗口可以嵌入其他窗口。
// 它支持在GPU上进行高效的视频缩放。
// 它仅在硬件和驱动支持Xv扩充的情况下才可以使用。
cluttersink
// 这个Gstreamer视频sink会给ClutterTexture发送数据用来显示。
// Clutter是一个跨平台的库,所以每个平台都可以使用这个sink。
// Clutter通过使用OpenGL作为后台渲染的方法来获得平台无关性,所以必须保证系统支持OpenGL。
alsasink
// 这个音频sink会通过ALSA来输出到声卡。
// 这个sink在几乎所有的linux平台上都有。它通常被看做声卡底层的接口,同时配置起来比较复杂。
plusesink
// 这个sink在一个PulseAudio服务器上播放声音。
// 它是比ALSA更高层级的抽象,而且使用更加方便并且提供更多地一些高级功能。
// 但是,在一些旧的linux系统上不够稳定。
// Mac OS X
osxvideosink
// 这是在Mac OSX系统上唯一提供的视频sink。
cluttersink
// 这个Gstreamer视频sink会给ClutterTexture发送数据用来显示。
// Clutter是一个跨平台的库,所以每个平台都可以使用这个sink。
// Clutter通过使用OpenGL作为后台渲染的方法来获得平台无关性,所以必须保证系统支持OpenGL。
osxaudiosink
// 这是在Mac OSX系统上唯一提供的音频sink。
// Windows
directdrawsink
// 这是Windows下最老的基于DirectDraw的视频sink。
// 它仅需要DirectX7,所以在目前几乎所有的Windows平台上都支持。
dshowvideosink
// 这是基于DirectShow的一个视频sink。
// 它可以使用不同的后端做渲染,比如EVR,VMR9或VMR7。
// 它支持视频图像尺寸调节并且可以过滤调节过得图像来避免混淆。
// 它实现了XOverlay的接口,所以视频窗口可以嵌入其他窗口中。
d3dvideosink
// 这是最新的基于Direct3D的视频sink。
// 它支持视频图像尺寸调节并且可以过滤调节过得图像来避免混淆。
// 它实现了XOverlay的接口,所以视频窗口可以嵌入其他窗口中。
cluttersink
// 这个Gstreamer视频sink会给ClutterTexture发送数据用来显示。
// Clutter是一个跨平台的库,所以每个平台都可以使用这个sink。
// Clutter通过使用OpenGL作为后台渲染的方法来获得平台无关性,所以必须保证系统支持OpenGL。
directsoundsink
// 这是Windows默认的音频sink,基于所有Windows版本都支持的DirectSound。
dshowdecwrapper
// DirectShow是类似于GStreamer的一个多媒体框架。
// 但它们也有很多的不同,pipeline是不能相互连接的。
// 但是,通过这个element,GStreamer就可以使用DirectShow的解码element的输出了。
// dshowdecwrapper可以包装多个DirectShow的解码器,然后放进GStreamer的pipeline。
// Android
eglglessink
// 这个视频sink是基于OpenGLES和EGL的。
// 它支持视频图像尺寸调节并且可以过滤调节过得图像来避免混淆。
// 它实现了XOverlay的接口,所以视频窗口可以嵌入其他窗口中。
openslessink
// 这是GStreamer在Android平台上唯一的音频sink,它基于OpenSL ES。
androidmedia
// android.media.MediaCodec是一个支持在设备侧编解码包括硬件编解码的一个Android上的API。
// 它在JellyBean之后就可以用了,GStreamer可以通过androidmedia插件来用这个API做音频和视频的解码。
// iOS
eglglessink
// 这个视频sink是基于OpenGLES和EGL的。
// 它支持视频图像尺寸调节并且可以过滤调节过得图像来避免混淆。
// 它实现了XOverlay的接口,所以视频窗口可以嵌入其他窗口中。
osxaudiosink
// 这是iOS上唯一支持的音频sink。
iosassertsrc
// 读取iOS设备上内容(比如:照片,音乐,录像等等)的source element。
// 当你使用playbin2并且URI使用assets-library://这个格式的时候会用到这个element。
iosavassetsrc
// 读取iOS设备上音视频内容(比如:照片,音乐,录像等等)的source element。
// 当你使用playbin2并且URI使用ipod-library://这个格式的时候会用到这个element。
// 这里的解码是针对系统优化过的。