使用 GStreamer 进行多用途的多媒体处理

简介: 多媒体,依照其定义,表示各种各样的媒体类型。您可以各种格式存储音频、视频和元数据。然而,这也就意味着要使用许多工具来处理这些不同的内容。

多媒体,依照其定义,表示各种各样的媒体类型。您可以各种格式存储音频、视频和元数据。然而,这也就意味着要使用许多工具来处理这些不同的内容。

GStreamer 可以为您提供帮助。通过将所有不同的工具和库隐藏到它的插件中,以及使用媒体管道 这个一般性概念,GStreamer 能以一种统一的方式表示对不同类型媒体所进行的操作。这使得您能够将精力集中于现有的媒体,而不是困惑于究竟应该使用什么样的管道。

这种统一处理方法的优点显而易见。您可以编写音乐 或视频 播放器,而不是编写 MP3 播放器或者 AVI/DivX 播放器。当您希望支持另一种格式时,无需进行深入的研究并为新的库编写代码。相反,仅需要安装这种格式的插件就可以了。就是这么简单,甚至不需要进行重新编译。所有的 GStreamer 应用程序都可以在运行的过程中采用新的格式。

GStreamer 可以解决许多问题,比如“需要存储来自不同来源具有相同格式的所有音频采样”。因为对所有的格式进行相似的处理,所以您只需要编写一个工具。这将节省时间,并使得解决方案更加健壮且更易于维护。而且,在您了解了 GStreamer 的相关概念之后,几乎可以将它应用到任何地方。如果您要让音频信息流经网络,那么只需要考虑这个网络,因为您所使用的音频 API(应用程序编程接口)和所有其他的操作都保持不变。

相关概念

由于其本身的特性,GStreamer 比普通的库位于更高的层次。因此,务必理解 GStreamer 究竟是什么以及它能够完成哪些工作。

GStreamer 是一种媒体处理库。这就意味着,它为您提供了某种转换过程的抽象模型(由输入、输出和不同的阶段组成),并且允许您为满足特殊的最终结果和特殊的媒体类型而构建这种转换过程的实例。下面是这种处理过程的一些示例:

  • 将 MP3 音频文件转换为 Ogg Vorbis
  • 播放 AVI 电影文件
  • 使用 IEEE1394 数字视频 (DV) 摄像机捕获现场表演,并将它保存为 MPEG-2 流

为了实现这些不同的结果,GStreamer 通过抽象的管道概念进行工作。管道 是一个有向图,媒体在这个有向图中从输入流到输出。管道由各种元素组成,而元素则是另一个核心概念。元素 是可以放入到管道中的对象,其中包装了对媒体进行的某种操作。您可以将不同的元素链接在一起,以使它们共同组成将输入转换为需要的输出的完整处理过程。通常,使用从左(上游)到右(下游)的数据流来对管道进行描述。使用 gst-launch 以同样的方式来编写管道,关于 gst-launch 的内容将在本文后面介绍。

请务必注意,到目前为止,所有的内容都是完全抽象的。没有涉及到视频或音频,之所以这样做,有一个很好的理由。上面描述的模型并不局限于任何特定的媒体类型。只要您可以将其描述为输入、输出和转换过程,就都可以利用管道来对其进行操作。例如,桌面可以作为媒体来源,您可以录制对视频文件的屏幕播放。事实上,Istanbul 应用程序正是这样做的(请参见参考资料部分)。

GStreamer 的核心本身并不包含任何元素。它只提供关于管道的知识。而所有特定的内容,都由相应的插件提供。插件 是一段经过编译的代码,通常以对象文件(UNIX? 上的 .so 和Microsoft? Windows? 上的 .dll)的形式分发,可以提供一个或多个元素。在启动过程中,GStreamer 对所有已安装的插件进行查询,以获取可用于应用程序的一组元素。插件通常可以调用其他的库,以完成特定的任务(例如,MPEG-2 解码器可以使用现有的库来处理 MPEG 格式的信息),但是应用程序并不需要知道这一点。它所看到的只是一些外观和工作方式相同的元素。

有些插件以核心源包的形式分发,并且将其编译为库,甚至从概念上看,它们是一些独立的实体。其他的基本插件以基于 gst 插件包的形式分发。在大多数的 GStreamer 安装中,都包含这些基本插件。然后还有一些好的、差的和糟糕的 gst 插件包,其中,根据这些不同的插件得到的支持级别和许可条款对其进行收集。最后,还有一些由第三方供应商分发或注册专门用于特定应用程序的插件。

融会贯通

既然已经了解了管道,您就还需要了解如何将它映射为 GStreamer 实现。在此过程中,您还将了解到更多的术语。

为什么要交换源和接收器呢?

实际上并没有对它们进行交换。接收单元是数据流进入元素的地方,而源单元是数据流产生的地方。因此,只包含源单元的元素称为源,而只包含接收单元的元素称为接收器。这是非常符合逻辑的,即使乍看上去可能有些别扭。

正如我所提到的,元素是处理过程的基本单元,由 GstElement 类来表示。GStreamer 是使用 C 进行编写的,但是它使用了来自 GTK+ 工具包的 GObject 库,以获得面向对象的特性(请参见参考资料部分)。元素中包含一些单元,这些单元是链接到其他元素的位置。有两种类型的单元:

  • 接收单元 为元素提供输入。
  • 可以通过源单元 访问元素所产生的数据。

这些单元所具有的相应功能称为能力。这些功能表示什么类型的数据可以流经该单元。例如,如果您检查一个 vorbisdec 元素(它是一个免费 Vorbis 代码的解码器),可以看到如清单 1 中所示的代码。一行开头处的美元符号 ($) 表示该行是常规的 UNIX Shell 命令。


清单 1. vorbisdec 元素信息中的代码段

$ gst-inspect-0.10 vorbisdec

[...]

Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      audio/x-raw-float
                   rate: [ 8000, 50000 ]
               channels: [ 1, 6 ]
             endianness: 1234
                  width: 32

  SINK template: 'sink'
    Availability: Always
    Capabilities:
      audio/x-vorbis

[...]

 

您可以看到,其中有两种单元模板:一种用于源 (src),另一种用于接收器。源单元的可用性为 always(其他可能的可用性取值为 sometimes 和 request),并且能够以 8kHz 到 50kHz 的速率输出原始浮点音频,该音频具有 1 至 6 声道、小端字节顺序以及 32 位宽的采样。另一方面,接收单元仅接收 Vorbis 编码的音频流。

要使管道正常工作,这些模板是至关重要的。当您试图将两个元素链接到一起以组成一个管道时,GStreamer 会查看它们的单元模板是否兼容。这个过程称为协商。在协商过程中,这些元素会尝试发现它们之间共同支持的最佳格式。如果不存在这样的格式,那么链接将会失败。否则,它们将会达成协议使用一种通用格式。这种格式不再是模板,而称为固定的能力,这表示所有的值都具有实际意义并且是明确的。然后,可以将数据从一个元素传递到另一个元素。

现在,您已经了解了开始工作前所需要的内容。为了完成具体的工作,我将介绍 GStreamer 中如“瑞士军刀”般锐利的工具,gst-launch 工具。


回页首

使用 gst-launch

了解您的工具

除了 gst-launch 之外,GStreamer 在分发时还附带了一些其他的工具,如 gst-inspect 和 gst-typefind。请使用这些工具,它们将是您最好的伙伴。

在不知道如何使用某个元素时,可以使用 gst-inspect。指定任何元素或插件的名称,它将显示 GStreamer 所知道的关于该对象的所有信息,当然,相关的信息可能会比较多。

使用 gst-typefind,这是 GStreamer 版本的优秀的旧式 file(1) UNIX 实用程序,您可以找出文件类型(或者确切地说,GStreamer 所认为的文件类型)。

gst-launch 是您所碰到用途最多的工具之一。对于 GStreamer 来说,它就像是 UNIX 的 Shell。使用该工具,您甚至可以通过特殊的语法(相应地称为 gst-launch 语法)构建复制的管道,如清单 2 中所示。


清单 2. gst-launch 行的示例

$ gst-launch-0.10 filesrc location=
  "concept.mp3" ! decodebin ! alsasink

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: audioclock0

 

清单 2 是一种最简单的音频播放器。现在,我正使用它听 concept.mp3。表 1 解释了如何从左到右阅读该命令行。


表 1. 清单 2 中介绍的语法的元素描述

元素 描述
gst-launch-0.10 这是该命令的名称。-0.10 表示在同时安装了旧的 0.8 发布版的情况下,应该使用特定版本 GStreamer 0.10。
filesrc location="concept.mp3" 它创建了一个 filesink 类的元素,并将其 location 属性设置为 concept.mp3。因为 filesrc 元素可以读取由 location 指定的文件,所以该命令为当前目录中的 concept.mp3 文件创建了一个读取器。
! 感叹号表示链接到。与 Shell 中的管道符号 (|) 类似,之所以选择使用感叹号,是因为它看起来与 (|) 比较相似,并且在 Shell 中无需对其进行转义(只要它的前后都有空格即可)。
decodebin 这是由 GStreamer 提供的 autoplugger。autoplugger 是一个元素,指定了其输入和输出的数据类型,它可以使用其他的可用元素来查找提供所需结果的子管道。请记住,GStreamer 中所有的链接都应该是类型化的,因此,感叹号 (!) 隐式地表示了它所链接的元素的类型信息。因为 filesrc 具有 ANY 类型的能力,所以 decodebin 首先对流尝试 typefind 操作。也就是说,它将查找表示类型的特征符号。所有的这些操作,对于用户来说都是透明的。
alsasink 这是适合于我的 Linux? 系统的音频输出的元素。它与声卡进行通信并为其提供原始音频采样。它必须与整个管道合拍,因为声卡具有使用数据的正常速率。

 

当我按下 Enter 时,它会显示一些状态信息,直到管道到达 PLAYING 状态。然后,开始以流的形式传输数据,而我可以听到声音,由我的声卡 (audioclock0) 设定其节奏。

正如您所看到的,GStreamer 为您节省了大量的 工作。您甚至无需了解尝试解码的媒体类型。请记住,正如 Shell 无法取代 C 程序,gst-launch 工具无法取代完整的 GStreamer 应用程序。例如,gst-launch 不允许您在其启动之后以任何方式对管道进行控制,所以您无法跳过流中的某些部分。尽管如此,它仍然是非常有用的,特别是对于一些快速的任务,比如将音频文件录制为另一种格式或者仅使用管道进行试验。


回页首

更深入的研究

本文只是简单地介绍了您能够使用 GStreamer 进行哪些工作。很显然,使用简单的 Shell 命令创建音频播放器非常不错。然而,这只是一个非常简单的播放器,没有任何用户界面和控件。要添加这些项目和更多的内容,您需要使用一些代码。即便如此,GStreamer API 仍然很简单并且经过了仔细的考虑。如果您不喜欢 C,可以从其他的绑定中进行选择,包括 Python 语言绑定的谨慎维护子集。

请阅读 gst-launch 的 man 页面。完整语法的范围更加广泛,并且您可以使用它来创建更复杂和有趣的管道,包括那些可以从代码中创建的管道。是的,您甚至可以创建自己的 gst-launch(请查看gst_parse_launch () 函数文档以了解如何完成这项工作)。

另外,请加入该邮件列表并顺便访问 IRC 频道(#gstreamer@irc.freenode.net)。GStreamer 开发人员组成了一个非常活跃的集体,通常总有人为您提供帮助或得到您的帮助。

 

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
  • GStreamer 应用程序开发手册:阅读该手册,以了解更多的关于 GStreamer 的概念,以及如何使用 GStreamer 编写应用程序。
  • GStreamer 插件程序员指南:在您需要创建自己的插件时,该指南非常有用。
  • GStreamer 0.10 核心参考手册:这是一本非常有价值的参考手册。
  • GObject 参考手册:阅读该手册,以了解关于 GStreamer 所使用的面向对象库的更多信息。
  • AIX? and UNIX:想了解更多内容吗?developerWorks 的“AIX and UNIX”专区提供数百篇关于 AIX 和 UNIX 的文章以及入门级、中级和高级教程,将让您大开眼界。
  • 技术讲座:收听技术讲座并保持与 IBM 技术专家同步。

获得产品和技术

  • GStreamer 主页:有关最新的信息和下载,请访问此站点。
  • Istanbul:Istanbul 是一种使用 GStreamer 的桌面会话录制程序。
  • IBM 试用软件:使用 IBM 软件开发您的下一个项目,可直接从 developerWorks 下载这些试用软件。

讨论

目录
相关文章
|
安全 Linux 网络安全
如何在群晖中本地部署WPS Office并实现公网远程访问
如何在群晖中本地部署WPS Office并实现公网远程访问
1612 0
|
存储 弹性计算 Linux
阿里云服务器试用与购买参考:试用与购买流程及相关规则和注意事项
阿里云服务器购买与试用全指南,阿里云每年都会推出针对新用户的免费试用活动,帮助用户低成本体验云服务的强大功能。本文将为大家解析阿里云服务器的购买与试用流程,包括注册认证、领取免费额度、选择实例配置全流程,帮助新手用户快速上手,避免操作误区。
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
2605 0
|
机器学习/深度学习 人工智能 自然语言处理
DeepSeek vs. ChatGPT:大语言模型的技术分野与应用边界全解析
DeepSeek更适合中文环境下对语言理解和生成准确性要求高、专业领域内容生成需求大,以及对成本敏感、实时性要求高和硬件资源有限的场景。ChatGPT则更适合需要处理多种语言,尤其是以英文等西方语言为主,以及对创意写作、开放域对话有需求,对成本和实时性要求不高且有强大硬件支持的场景。两款模型各有侧重,用户可根据具体需求选择最适合的工具。
|
机器学习/深度学习 人工智能 算法
基于YOLO的中医舌苔自动识别系统 | 五类舌象精准检测【含完整数据+训练源码】
本项目以 YOLOv8 为核心检测引擎,实现了对中医舌象中五类舌苔特征的高效识别,构建了一个具有实用价值的中医智能辅助诊断系统原型。项目涵盖从数据准备、模型训练到推理部署的全流程,配套图形界面(可选),实现了开箱即用、模块清晰、易于复现的目标。
基于YOLO的中医舌苔自动识别系统 | 五类舌象精准检测【含完整数据+训练源码】
|
设计模式 前端开发 C语言
【设计模式】 观察者模式介绍及C代码实现
观察者模式(Observer Pattern)是一种常用的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并更新自己的状态。观察者模式又称为发布-订阅模式。Subject(主题):被观察的对象,它将所有观察者对象的引用保存在一个集合中,并提供了添加和删除观察者对象的方法。Observer(观察者):观察者接口,定义了更新自己的状态的方法,以便主题在状态发生变化时通知观察者。ConcreteSubject(具体主题)
1011 0
【设计模式】 观察者模式介绍及C代码实现
|
算法 UED 开发者
🚀短链(Short Link):发展动态与工具推荐🚀
短链是将冗长的URL通过特定算法压缩成简短的字符串,便于用户在社交媒体和营销活动中分享。短链不仅美化了链接,还提升了用户体验,并具有易于传播和跟踪分析的优势。本文介绍了短链的作用、发展历程,以及在goo.gl退出后,推荐的替代工具如Dub.co,帮助用户继续享受短链带来的便利与营销价值。
2001 1
🚀短链(Short Link):发展动态与工具推荐🚀
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
1343 1
|
机器学习/深度学习 传感器 人工智能
智慧无人机AI算法方案
智慧无人机AI算法方案通过集成先进的AI技术和多传感器融合,实现了无人机的自主飞行、智能避障、高效数据处理及多机协同作业,显著提升了无人机在复杂环境下的作业能力和安全性。该方案广泛应用于航拍测绘、巡检监测、应急救援和物流配送等领域,能够有效降低人工成本,提高任务执行效率和数据处理速度。
3631 2
智慧无人机AI算法方案

热门文章

最新文章