目标

本教程给出了一系列开发中常用的element。它们包括大杂烩般的eleemnt(比如playbin2)以及一些调试时很有用的element。

简单来说,下面用gst-launch这个工具给出一个个具体例子(命令行),你可以用-v参数可以看到Pad得Caps是如何协商的。

Bins

这些是Bin element,它们在内部包含其他的element,已经组成了内部的pipeline,但在外部,我们还是把它们当成一个element。

Playbin2

这个element在整个系列的教程里面广泛的被使用了。它会处理播放的方方面面,从源经过解复用、解码到最后的显示。同时它也非常灵活,有很多设置项,在后面有教程会更详细的讲述到。

uridecodebin

这个element从一个URI获得数据然后解码成原始媒体数据。它会选择一个能处理给定的URI的source element,然后和decodebin2连接起来。它在一个媒体里面发现多少流就提供多少source pad来输出,这点和解复用很像。

[objc] view
plain
 copy

  1. .10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! ffmpegcolorspace ! autovideosink</span>
[objc] view
plain
 copy

  1. .10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink</span>

decodebin2

这个element会自动用解复用插件和解码插件创建解码pipeline。它被使用起来更方便的uridecodebin作为一个source element集成在自己内部了。以前还有一个旧的decodebin,目前已经废弃不用了。和uridecodebin一样,它也是在媒体里面发现多少流就提供多少source
pad来输出。

[objc] view
plain
 copy

  1. .10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! autovideosink</span>

文件输入/输出

filesrc

这个element会读取一个本地文件然后用Caps来输出媒体数据。如果你想要获得一个正确地Caps,那么需要用typefind element来搜索流或者把filesrc的typefind属性设置成TRUE。

[objc] view
plain
 copy

  1. .10 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin2 ! autovideosink</span>

filesink

这个element会把所有收到的媒体数据存成文件。使用location属性来指定路径和文件名。

[objc] view
plain
 copy

  1. .10 audiotestsrc ! vorbisenc ! oggmux ! filesink location=test.ogg</span>

Network

souphttpsrc

这个element作为一个客户端,使用SOUP库经由HTTP来接收数据。通过location属性来设置URL。

[objc] view
plain
 copy

  1. .10 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! autovideosink</span>

测试媒体数据生成

这些element在测试pipeline是否工作时是非常有用的,它们是确保可以工作生成数据的,所以可以取代数据源。

videotestsrc

这个element生成一个固定的video输出(通过pattern属性来设置),用来测试视频的pipeline。

[objc] view
plain
 copy

  1. .10 videotestsrc ! ffmpegcolorspace ! autovideosink</span>

audiotestsrc

这个element生成一个音频信号(通过设置wave属性来设置),用来测试音频的pipeline。

[objc] view
plain
 copy

  1. .10 audiotestsrc ! audioconvert ! autoaudiosink</span>

视频适配

ffmpegcolorspace

这个element会把一个色彩空间转换到另一个色彩空间(比如从RGB转到YUV)。它也可以在转换不同的YUV格式或者RGB格式。

通常来说,在解决协商问题时,这个element是你的第一选择。当上游element和下游element是兼容的时候,这个element就是直通的,所以对性能的影响几乎是不存在的。

作为一个习惯,当你用一个不知道Caps的element的时候,总是可以用一下ffmpegcolorspace,就像autovideosink一样。

[objc] view
plain
 copy

  1. .10 videotestsrc ! ffmpegcolorspace ! autovideosink</span>

videorate

这个element接受带时间戳的视频数据转换成匹配source pad帧率的流。通过丢弃或者复制帧来执行改正,而不是通过古怪的算法

这个在连接不同帧率的element时很有用。正如其他的适配插件,如果不需要的话会直通过去(上下游element能匹配上)。

如果实际帧率未知的情况下,为了以防万一,使用这个element是个不错的主意。

[objc] view
plain
 copy

  1. .10 videotestsrc ! video/x-raw-rgb,framerate=30/1 ! videorate ! video/x-raw-rgb,framerate=1/1 ! ffmpegcolorspace ! autovideosink</span>

videoscale

这个element可以修改视频帧的尺寸。这个element会先检查不修改视频尺寸是否可行,如果可行,就不在进行尺寸的转换。所以在pipeline中加入这个element是安全的,可以提高鲁棒性。

这个element支持很多色彩空间,包括不同的YUV和RGB格式。而且可以放在pipeline的任何地方。

如果视频是往一个用户控制的窗口输出时,加上videoscale这个element是个好主意,因为并不是所有的视频输出都是支持缩放的。

[objc] view
plain
 copy

  1. .10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw-yuv,width=178,height=100 ! ffmpegcolorspace ! autovideosink</span>

音频适配

audioconvert

这个element会转化原始的不同音频格式之间的缓冲。它支持从整数到浮点数的转化,符号数/字节序转换以及声道转换。

正如ffmpegcolorspace对于视频做的一样,这个element使用很安全,你可以用来解决音频不匹配的问题。

[objc] view
plain
 copy

  1. .10 audiotestsrc ! audioconvert ! autoaudiosink</span>

audioresample

这个element使用可配置的窗口函数重采样音频缓冲到不同的采样率来增强质量。

同样地,它可以解决采样率的问题,同时不需要担心出错。

[objc] view
plain
 copy

  1. .10 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! audioresample ! audio/x-raw-float,rate=4000 ! audioconvert ! autoaudiosink</span>

audiorate

这个element接受带时间戳的音频帧,然后通过增加或者降低采样来获得一个标准流。它不能修改采样率,只能通过移除重叠部分和填充空白部分来获得连续“干净”的输出。

当时间戳丢失接收器要求所有的采样同时渲染时这个element比较有用。这个很难给出一个例子,所以就省略了。

多线程

queue

queue已经在《GStreamer基础教程07——多线程和Pad的有效性》里面介绍过了。基本上,一个queue执行两个任务:

数据可以一直放进队列直到满为止

queue会给source pad创建一个新的线程,这样就可以解耦对于sink和source pad的处理

另外,queue在变空或满的时候会触发信号,可以抛弃一些缓冲数据来避免阻塞。

如果你不面临网络缓冲的困境,那么使用更简单的queue element而不是queue2,具体例子同样参考《GStreamer基础教程07——多线程和Pad的有效性

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,提供相互独立的线程。否则一旦数据在一个分支上阻塞了,那么其它分支也会停止。

[objc] view
plain
 copy

  1. .10 audiotestsrc ! tee name=t ! queue ! audioconvert ! autoaudiosink t. ! queue ! wavescope ! ffmpegcolorspace ! autovideosink</span>

能力

capsfilter

在《GStreamer基础教程10——GStreamer工具》里面已经解释了gst-launch怎么使用Caps过滤。当我们编程实现一个pipeline时,Caps过滤通常用capsfilter这个element来实现。这个element不会修改数据,但会限制数据的类型。

[objc] view
plain
 copy

  1. .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属性。

[objc] view
plain
 copy

  1. .10 audiotestsrc num-buffers=1000 ! fakesink sync=false</span>

identity

这是一个哑巴element仅仅把输入数据不加修改的传过来。它也有一些有用的调试函数,例如偏移量和时间戳检测,或者丢弃缓冲。想要进一步了解请阅读它的文档。

[objc] view
plain
 copy

  1. .10 audiotestsrc ! identity drop-probability=0.1 ! audioconvert ! autoaudiosink</span>

【GStreamer开发】GStreamer基础教程14——常用的element的更多相关文章

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

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

  2. [SQL基础教程]1-4 SQL 表的创建

    [SQL基础教程]1-4 SQL 表的创建 创建数据库 语法 CREATE DATABASE <数据库名称> // example CREATE DATABASE shop; 创建表 语法 ...

  3. GStreamer基础教程12 - 常用命令工具

    摘要 GStreamer提供了不同的命令行工具用于快速的查看信息以及验证Pipeline的是否能够正确运行,在平时的开发过程中,我们也优先使用GStreamer的命令行工具验证,再将Pipeline集 ...

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

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

  5. Docker基础教程(常用命令篇)

    1.查看docker信息 # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2.启动容器 # 交互式 $docker run -it ...

  6. Java基础教程(14)--嵌套类

      Java允许在一个类中定义另外一个类,这样的类被称为嵌套类,就像下面这样: class OuterClass { ... class NestedClass { ... } }   嵌套类分为两种 ...

  7. Ruby 基础教程1-4

    1.对象 数值对象 字符串对象 数组对象,散列对象 正则表达式对象 时间对象 文件对象 符号对象 2.类 Numeric String Array Hash Regexp File Symbol 3. ...

  8. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  9. 【GStreamer开发】GStreamer基础教程13——播放速度

    目标 快进,倒放和慢放是trick模式的共同技巧,它们有一个共同点就是它们都修改了播放的速度.本教程会展示如何来获得这些效果和如何进行逐帧的跳跃.主要内容是: 如何来变换播放的速度,变快或者变慢,前进 ...

随机推荐

  1. Linux下安装Phalcon系统环境安装Phalcon 及 安装Phalcon Developer Tools

    一.安装Phalcon Phalcon 需要用的的PHP扩展函数有如下: curl gettext gd2 (to use the Phalcon\Image\Adapter\Gd class) li ...

  2. 建立自己的键盘栈(shortcutkeyStack)

    建立自己的键盘栈(shortcutkeyStack) 作为一名开发者, 快捷键是必不可少的, 并且各种开发工具都有提供快捷键. 但是各种工具(IDE,编辑器)因为历史或者其他不可抗原因(比如键盘的布局 ...

  3. git 导出远程特定分之

    很多时候,git clone 只是 clone 下来了 master 分支,如果想 clone 特定分支.有的时候不知如何是好. 找到了如下的命令,记录一下.以便有需要的同学可以使用. git co ...

  4. Linux 系统安装下安装 mysql5.7(glibc版)

    转自:https://www.cnblogs.com/mujingyu/p/7689116.html 前言:经过一天半的折腾,终于把 mysql 5.7.17 版本安装上了 centos 7 系统上, ...

  5. 360杯复赛流量分析题 详细writeup

    题目名: 这是捕获的黑客攻击数据包 通过分析流量包,得知黑客先上传了一个文件: 追踪TCP流,可以看到文件内容,是一个木马: 然后通过get请求一个加密key,在响应里能看到key的值. 接下来就是用 ...

  6. !!a标签和button按钮只允许点击一次,防止重复提交

    button 方法:加上属性disabled = “disabled” 或者 disabled = “true” <button id="btn" disabled=&quo ...

  7. js 对象 toJSON 方法

    浅谈 js 对象 toJSON 方法   前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一 ...

  8. Java hashCode与equals学习

    1.关于Object类的equals方法的特点 a) 自反性: x.equals(x) 应该返回true b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true c ...

  9. elementUI el-table合并单元格

    合并单元格,如果id列值一致,则合并. <el-table :data="tableData6" :span-method="objectSpanMethod&qu ...

  10. 关于postman与shiro权限验证问题

    作为一个java的开发小白 , 写完一个web方法测试是必不可少的 , 只有测试号没问题的方法给别人时 ,别人才不知道你是小白 , 要不然很尴尬的 .新手入坑的测试工具是postman .这个工具用起 ...