使用 AudioTrack 播放音频轨道

栏目: IOS · Android · 发布时间: 5年前

内容简介:Amit Trivedi:《Naina Da Kya Kasoor》电影:《调音师》插曲

Amit Trivedi:《Naina Da Kya Kasoor》 

电影:《调音师》插曲

使用 AudioTrack 播放音频轨道

01 前言

大家好,本文是     iOS/Android 音视频开发专题  的第七篇,该专题中 AVPlayer 项目代码将在 Github 进行托管,你可在微信公众号 GeekDev 后台回复  资料   获取项目地址。

在上篇文章    OpenGL ES 实现播放视频帧   中我们已经知道如何使用 GLSurfaceView 将解码后的视频渲染到屏幕上,但是,我们的播放器还不具备音频播放的功能,在本篇文章中我们将使用 AudioTrack 播放解码后的音频数据(PCM)。

本期内容:

  • PCM 介绍

  • AudioTrack API 介绍

  • 使用 MediaCodec 解码及播放音频轨道

  • 结束语

02  PCM 介绍

PCM (Pulse-code modulation 脉冲编码调制 )是一种将模拟信号转为数字信号的方法。由于计算机只能识别数字信号,也就是一堆 二进制序列,所以 麦克风采集到的模拟信号会被 模数转换器转换,生成数字信号。最常见的方式就是经过 PCM A/D   转换。

A/D 转换涉及到采样,量化和编码

采样: 由于存储空间有限,我们需要对模拟信号进行采样存储。采样就是从模拟信号进行抽样,抽样就涉及到采样频率,采样 频率 是每秒钟对声音样本的采样次数,采样率越高,声音质量越高,越能还原真实的声音。因此,我们一般称模拟信号是连续信号,数字信号为离散,不连续信号。

根据奈奎斯特理论,采样频率不低于音频信号最高频率的 2 倍,就可以无损的还原真实声音。

而由于人耳能听到的频率范围在  20Hz~20kHz,所以,为了保证声音不失真,采样频率我们一般设定为 40kHz 以上。常用的采样频率有  22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz。目前在 Android 设备中,只有  44.1kHz 是所有设备都支持的采样频率。

使用 AudioTrack 播放音频轨道

「图片来自Google」

量化: 模拟信号经过采样成为离散信号,离散信号经过量化成为数字信号。 量化是将经过采样得到的离散数据转换成二进制数的过程,量化深度表示每个采样点用多少比特表示,在计算机中音频的量化深度一般为4、8、16、32位(bit)等。

量化深度的大小影响到声音的质量,显然,位数越多,量化后的波形越接近原始波形,声音的质量越高,而需要的存储空间也越多;位数越少,声音的质量越低,需要的存储空间越少。CD音质采用的是16 bits,移动通信 8bits。

另外,WAV 文件其实就是 PCM 格式,因为播放 PCM 裸流时,我们需要知道 PCM 的采样率, 声道数, 位宽等信息,WAV 只是在文件头前添加了这部分描述信息, 所以 WAV 文件可以直接播放。

使用 AudioTrack 播放音频轨道

「WAV 文件头/图片来自Google」

PCM 是音频处理中频繁接触的格式,通常我们对音频的处理都是基于 PCM 流,如常见的音量调节, 变声, 变调等特性。

使用 AudioTrack 播放音频轨道

03 AudioTrack API 介绍

在 Android 中,如果你想要播放一个音频文件,我们一般优先选用 MediaPlayer,使用 MediaPlayer 时你不需要关心文件的具体格式,也不需要对文件进行解码,使用 MediaPlayer 提供的 API,我们就可以开发出一个简单的音频播放器。

AudioTrack 是播放音频的另外一种方式  「如果你感兴趣还可以了解下 SoundPool」 , 并且只能用于播放 PCM 数据。

AudioTrack API 概述 :

1. AudioTrack 初始化

* @param mode 模式

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,

2. 计算最小缓冲区大小

初始化 AudioTrack 时的  bufferSizeInBytes 参数,可以通过  getMinBufferSize 计算算出合适的预估缓冲区大小, 一般为 getMinBufferSize 的整数倍

3. 写入数据

public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes)

4. 开始播放

如果 AudioTrack 创建时的模式为  MODE_STATIC 时,调用 play 之前必须保证  write 方法已被调用。

5. 暂停播放

暂停播放数据,尚未播放的数据不会被丢弃,再次调用 play 时将继续播放。

6. 停止播放  

停止播放数据,尚未播放的数据将会被丢弃。

7. 刷新缓冲区数据

刷新当前排队等待播放的数据,已写入当未播放的数据将被丢弃,缓冲区将被清理。

04 MediaCodec 解码并播放音频轨道

如果我们要播放一个音频轨道,需要将音轨解码后才可以播放,之前我们一直在说如何解码视频,如果你看过 AVPlayer Demo ,你一定对如何创建视频轨道解码器很熟悉了,如果我们要解码一个音频轨道,只需要改下 mimeType 即可。创建一个音频轨道解码如下:

解码音频时我们将  extractMimeType 设定为  "audio/"   ,其它代码与解码视频时相同。

接着我们 监听到  INFO_OUTPUT_FORMAT_CHANGED 状态时,获取该音频轨道的格式信息,  MediaFormat 提供了足够的信息可以让我们初始化  AudioTrack。

        // 从 MediaCodec 吐出解码后的音频信息

// 写入解码后的音频数据

当我们 通过  INFO_OUTPUT_FORMAT_CHANGED 获取到 MediaFormat 并初始化  AudioTrack   后,就可以通过  write  方法写入解码后的音频数据。

详见:  DemoAudioTrackPlayerActivity  

使用 AudioTrack 播放音频轨道

05 结束语

关注  GeekDev  公众号你将在第一时间获取最新内容。 如果你想了解更多信息, 可关注微信公众号 ( GeekDev 并回复   资料  获取。

往期内容:

iOS/Android 音视频开发专题介绍

iOS/Android 音视频概念介绍

MediaCodec/OpenMAX/StageFright 介绍

使用 MediaCodec 解码音视频

OpenGL ES for Android 世界

下期预告:

《 AVPlayer 添加音效 

   

使用 AudioTrack 播放音频轨道


以上所述就是小编给大家介绍的《使用 AudioTrack 播放音频轨道》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

看见未来

看见未来

余晨 / 浙江大学出版社 / 2015-4-15 / 59.00元

【内容简介】 这是互联网群星闪耀的时代,巨人们用最尖端的技术和自成体系的哲学改变着我们的生活,甚至影响了整个世界和人类的历史进程。在这个时代,没有人可以避开互联网的渗透。互联网早已不是简单的技术变革,人们正试图赋予其精神和内涵,以期互联网能更好地为人类所用。 本书中作者 面对面地采访了包括马克·扎克伯格、埃隆·马斯克、杨致远、凯文·凯利、克里斯·安德森、罗伯特·希勒、迈克尔·莫瑞茨、凯......一起来看看 《看见未来》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具