目标

本教程展示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. 2019.11.29 Mysql的数据操作

    为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...

  2. __property 关键字的使用

    https://blog.csdn.net/lixingshi/article/details/41277577 __property是属性关键字,用来定义类的某种属性. 给类定义属性,是BCB的扩展 ...

  3. RookeyFrame 迁移 线下Model 新增属性 迁移 到数据库

    在类库 Rookey.BusSys.Operate(类库) -> InitOperate.cs(类)  -> App_Start(方法) 添加代码(举例): ToolOperate.Rep ...

  4. leetcode解题报告(32):Teemo Attacking

    描述 In LLP world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poison ...

  5. shell 命令的重命名alias

    1.实现别名:alias ddd="df -Th": 2.删除别名:unalias ddd: 3.显示所有别名命令列表:alias: 4.存放位置:~/.bashrc  (加入该文 ...

  6. WARNING: You are using pip version 19.1.1, however version 19.2.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.

    pip3 install --upgrade pip

  7. CF1217题解

    E 也不知道为啥这题咕了好久~ 有一个明显的结论:如果存在有一位有两个数该为不为0,则这两个数可以组成一个满足条件的解 每一位分别维护不为0的和最小的即可

  8. 常用spaceclaim脚本

    #创建一个长方体,通过两点来确定一个立方体 #MM表示的是以毫米作为单位 #返回的是一个BlockBody的对象 #本函数还有第三个参数可选,分别代表增加材料,切除材料等等 #默认值为增加材料 注:第 ...

  9. 优雅地使用eruda在移动端上调试网页

    注:本文有一小部分截图为桌面端,但所有内容都亲测在移动端上可用. 你曾否在洛谷上用<F12>把错的数据点改成AC?是否有过自己尝试搭建网站,在移动端上js代码运行出错?如果你的回答是肯定的 ...

  10. 微信小程序wx.uploadFile的两个坑

    -- setImage:function(e){ var _this = this //坑1 wx.chooseImage({ count: , sizeType: ['original', 'com ...