目标

本教程展示GStreamer是如何进行数字音频传输的。

介绍

在常见的模拟格式外,高端的音频系统通常都接受数字格式,压缩的非压缩的都能接受。因为音频信号是从电脑传到音箱,用一种更有弹性的形态会更能保证质量。

典型的连接是通过S/PDIF线缆,可以是光缆或者同轴电缆。

在这种情况下,GStreamer是不需要做音频的解码的,可以运行在pass-through模式下,简单的输出编码后的数据,让外接的音频系统进行解码。

GStreamer音频sink的内部实现

首先,在系统层级必须支持数字音频的输出。实现这点需要操作系统的支持,但通常有一个音频控制面板,然后有个“Digital
Audio Output”的选项。

对每个平台的GStreamer的音频sink(Linux下的pulsesink,OS
X下的osxaudiosink,Windows下的directsoundsink),可以检测数字音频输出是否可用以及根据接收到的编码后的数据来调整cap。比如,这些element通常是接收audio/x-raw-int或者audio/x-raw-float数据,当数字音频输出打开的时候,他们可以接收audio/mpeg、audio/x-ac3、audio/x-eac3以及audio/x-dts。

那么,当playbin2在建立解码pipeline时,它会发现音频sink可以直接和编码后的数据相连,这样就需要一个音频解码器了。这个过程是自动完成的,并不需要应用介入。

在Linux上,还存在其他的音频sink,比如:alsasink的工作就不一样。

数据格式的预警

当系统层打开了数字音频输出功能后,无论在S/PDIF线缆后面的实际音频解码器是否支持这些格式,GStreamer的音频sink会自动列出所有的数字音频Cap。这样做的原因有两个,一个是没法获得一个外接的解码器支持的格式,另一个是线缆的连接可能会脱落(并非永远可靠)。

比如,我们在系统的音频控制面板里面打开了数字音频输出,directsoundsink会在audio/x-raw-int之外自动显示audio/x-ac3、audio/x-eac3和audio/x-dts,但是一个外接的解码器可能只能接受原始流。

要解决这个问题需要最终用户的介入,因为只有最终用户才能知道外接的解码器能支持什么格式的数据。

在一些系统里面,最简单的方法就是告诉操作系统外接的音频解码器能接受的格式。这样的话,GStreamer的音频sink只需要提供这些格式的cap就可以了。这些可以接受的音频格式通常都是在操作系统的音频配置面板上选择的,数字音频输出也是在这里打开。但是,并非所有的音频驱动都支持这样做。

另一个解决方案是使用包含一个capsfilter element和一个audio sink的客制化的sink bin。这样外接解码器支持的格式就可以在caps filter上过滤,保证不符合的都过滤掉。这样应用就不再依赖用户对系统的配置,虽然还是需要用户的介入,但不再需要考虑音频驱动是否提供选择项了。

请注意,不要使用autoaudiosink这个音频sink,因为它只支持raw数据,会忽略所有压缩过的格式。

【GStreamer开发】GStreamer播放教程09——数字音频传输的更多相关文章

  1. 【GStreamer开发】GStreamer播放教程06——可视化音频

    目标 GStreamer有一系列把音频转换成视频的element.他们可以用于科学的目的或者增加音乐播放器的趣味性.本教程展示: 如何允许音频的可视化 如何选择可视化element 介绍 在playb ...

  2. 【GStreamer开发】GStreamer基础教程16——平台相关的element

    目标 虽然GStreamer是跨平台的framework,但不是所有的element都是在所有平台下都有的.比如,音频和视频的sink都非常依赖于当前的window系统,根据当前的平台需要选择不同的e ...

  3. gstreamer应用开发(播放器)之旅

    GStreamer开发,主要分为两块:应用开发.插件开发. 插件开发人员,通常是编解码库的作者(做出了编解码库后,希望gstreamer能用起来这个库,因此增加这个适配层).芯片原厂人员(将自家的hw ...

  4. 安装gstreamer开发环境

    ubuntu中安装gstreamer开发环境: * 安装gstreamer基本库,工具,以及插件 sudo apt--dev gstreamer-tools gstreamer0.-tools gst ...

  5. 【转】一步一步教你在Ubuntu12.04搭建gstreamer开发环境

    原文网址:http://blog.csdn.net/xsl1990/article/details/8333062 闲得蛋疼    无聊寂寞冷    随便写写弄弄 看到网上蛮多搭建gstreamer开 ...

  6. Python开发的入门教程(一)-数据类型、变量

    介绍 Python第一门课程,是Python开发的入门教程,将介绍Python语言的特点和适用范围,Python基本的数据类型,条件判断和循环,函数,以及Python特有的切片和列表生成式. Pyth ...

  7. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  8. 开发快平台(M302I小e开发板系列教程)

    开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...

  9. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

随机推荐

  1. windbg调试托管代码 .Net clr

    现在很多的程序都是多语言混合编程的,比如我司的产品,就是用C++/.net clr混合编制的.那么当我们调试这样的程序时,一定要注意,比如有时我们只看到c++的栈和名称,而.net clr的代码确看不 ...

  2. 【dp】P1541 乌龟棋

    链接: https://www.luogu.org/problemnew/show/P1541 [思路]: 用f[a][b][c][d]表示,第一张卡用a张,第二张卡用b张..........然后就盘 ...

  3. git的实际工作经验总结

    分支工作的一个较佳的实践, 即git工作的最佳实践 从最初的svn到后来的git,上来给我的感觉就是git更方便, 可以在本地进行版本的提交,回退. 后来对hash有所了解, 知道了git的每个版本其 ...

  4. 区块链阶段1-Linux基础- 1 Linux简介

    对于一般的办公和娱乐我们接触更多的是Windows.但是对于IT从业人员,特别是从事服务器管理以及软件开发的人员来讲,我们需要熟练掌握 Linux/UNIX操作系统的知识.所以,Linux 是众多操作 ...

  5. dbutils的环境搭建以及使用

    DBUtils的简单实现方式 第一步.创建Java工程[此处使用的是maven工程]并导入jar包 <!--导入mysql数据库驱动--> <dependency> <g ...

  6. ICEM-带把圆环

    原视频下载地址:https://pan.baidu.com/s/1pKSXyR5 密码: dynm

  7. 利用Wireshark抓取并分析OpenFlow协议报文

    OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...

  8. Oracle语法 及 SQL题目(三)

    目录 SQL题目六 第一个问题思路(查询酒类商品的总点击量) 第二个问题思路(查询每个类别所属商品的总点击量,并按降序排列) 第三个问题思路(查询所有类别中最热门的品种(点击量最高),并按点击量降顺序 ...

  9. 手写HashMap实践

    1.什么是HashMap 2.源码分析 3.手写实现 4.不足 一.什么是HashMap hash散列 将一个任意长度通过某种算法(hash函数算法)换成一个固定值 map: 地图x,y 存储 总结: ...

  10. 宝塔php open_basedir restriction in effect

    解决方法一: 1.网站管理的  防跨站攻击去掉勾选,重启网站,清除浏览器缓存 解决方法二: