目标

本教程给出了一系列开发中常用的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. 98: 模拟赛-神光 dp

    $code$ #include <cstdio> #include <cstring> #include <algorithm> using namespace s ...

  2. python写一个随机点名软件

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  3. 《挑战30天C++入门极限》C++运算符重载赋值运算符

        C++运算符重载赋值运算符 自定义类的赋值运算符重载函数的作用与内置赋值运算符的作用类似,但是要要注意的是,它与拷贝构造函数与析构函数一样,要注意深拷贝浅拷贝的问题,在没有深拷贝浅拷贝的情况下 ...

  4. Alpha冲刺(1/6)

    队名:無駄無駄 组长博客 作业博客(5分) 以下内容一个小组共55分,看完之后对此部分整体打分 张越洋 过去两天完成了哪些任务 如何进行团队代码的版本管理 如何使用微信云开发 如何使用管理微信开发团队 ...

  5. OpenFOAM清理计算结果(只保留原始的0,system,constant)

    原视频下载地址:https://yunpan.cn/cMpyLZq8sWQgq(提取码:a08b)

  6. Java IO系统--字符流

    字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ...

  7. Centos7修改为固定IP后 yum 出现could not retrieve mirrorlist

    Centos7修改为固定IP后 yum 出现could not retrieve mirrorlist,发现yum源的域名无法解析 按照6,修改/etc/resovle.conf,新增域名解析服务器1 ...

  8. 在Oracle Sql Developer中查看oracle版本

    输入select * from v$version; 执行即可. --END-- 2019-11-29 12:34

  9. UML建模——活动图(Activity Diagram)

    活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流 •活动图是一种表述过程基理.业务过程以及工作流的技术 ...

  10. linux内核中的电源管理接口

    1. pm_runtime_enable/pm_runtime_disable 使能/禁止runtime PM,分别对dev->power.disable_depth执行++和--操作,这个变量 ...