Kernel-Zhang的个人主页

gstreamer插件编写指南:编写元素时需要检查的事项

本章随机选取了一些编写元素时需要注意的事项。至于你能在多大程度上遵守这些准则,这取决于你自己。不过,请记住,当你编写一个元素,并希望将其纳入主流 GStreamer 发行版时,它必须满足这些要求。我们将尽可能解释这些要求的原因。 关于状态 确保元素的状态在变为NULL 时被重置。 理想情况下,应将所有对象属性设置为其原始状态。该函数也应在 _init 中调用。 ...

gstreamer插件编写指南:编写管理器

管理器是增加功能或统一其他(一系列)元素功能的元素。管理器通常是一个带有一个或多个衬底的GstBin。其中包含的是实际的重要元素。有几种情况下这是有用的。例如: 在另一个元素中添加对带有自定义事件处理功能的私有事件的支持。 为另一个元素添加对自定义衬底_query ()或_convert ()处理的支持。 在另一个元素的数据处理函数(...

gstreamer插件编写指南:编写多对一元素和复用器

N 对 1 元素在“请求型和暂态型衬底”以及“不同的调度模式”中都曾被提及和讨论过。N 对 1 元素的主要特点是,每个 pad 都在自己的线程中处于推模式,N 对 1 元素通过基于预期时间戳的逻辑同步这些流。这意味着,除了提供最早的下一个预期时间戳的数据流外,它让所有数据流等待。 当该数据流通过一个缓冲区后,下一个最早的预期时间戳就会被计算出来,然后我们又从原来的位置开始,直到所有数据流都达...

gstreamer插件编写指南:编写解复用器和解析器

解复用器是需要特别注意的 1 对 N 元件。它们负责将未经解析的原始数据打上时间戳,转换成基本的视频或音频流。这里将提到几个罪魁祸首,并提供常见的解决方案。解析器是只有一个源衬底的解多路复用器。此外,它们只会将数据流切割成缓冲区,而不会接触其他数据。 如前文“能力集协商”中所述,解复用器应使用固定能力集,因为其数据类型不会改变。 正如“不同的调度模式”中所讨论的,解复用器元件可以用多种方...

gstreamer插件编写指南:预制基类

到目前为止,我们已经了解了创建任何类型 GStreamer 元素的底层概念。现在,让我们假设你只想创建一个与“esdsink”工作原理完全相同的简单音频链路,或者一个简单地将音频音量正常化的过滤器。这类元素在概念上非常通用,而且由于它们没有什么特殊功能,因此无需提供自己的调度器激活函数和进行复杂的能力集协商,它们更容易编写代码。为此,GStreamer 提供了简化某些类型元素的基类。本章将讨...

gstreamer插件编写指南:创建特殊元素类型

到目前为止,我们已经了解了几乎所有可以嵌入 GStreamer 元素的功能。其中大部分都相当低级,让我们深入了解 GStreamer 的内部工作原理。幸运的是,GStreamer 包含一些更易于使用的接口来创建此类元素。为此,我们将仔细研究 GStreamer 提供基类(源、汇和转换元素)的元素类型。我们还将仔细研究一些不需要特定编码(如调度交互或数据传递),但需要特定流水线控制(如 N 对...

gstreamer插件编写指南:标签(元数据和流信息)

概述 标签是存储在数据流中的信息片段,它们不是内容本身,而是对内容的描述。大多数媒体容器格式都以这种或那种方式支持标签。Ogg 使用 VorbisComment,MP3 使用 ID3,AVI 和 WAV 使用 RIFF 的 INFO 列表块等。GStreamer 提供了一种通用方法,让元素从流中读取标签,并将其展示给用户。标签(至少是元数据)将成为流水线内流的一部分。这样做的结果是,只要输...

gstreamer插件编写指南:接口

在前面的“添加属性”一章中,我们介绍了控制元素行为的 GObject 属性概念。这个概念非常强大,但它有两个很大的缺点:首先,它过于通用;其次,它不是动态的。 第一个缺点与终端用户接口的可定制性有关,该接口将用于控制元素。有些属性比其他属性更重要。一些整数属性最好用旋转按钮部件来显示,而另一些则最好用滑块部件来表示。这些都是不可能的,因为用户接口在应用程序中没有实际意义。表示比特率属性的用...

gstreamer插件编写指南:支持动态参数

有时对象的属性参数不足以控制影响元素行为。在这种情况下,你可以将这些参数标记为“可控”。应用程序可以有意识地使用控制器子系统随时间动态调整属性值。 警告,本部分描述的是 0.10 版本,已经过时。 入门 控制器子系统包含在gstcontroller库中。您需要在元素源文件中包含该头文件: ... #include <gst/gst.h> #include <...