使用 AudioTrack 播放音频轨道

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

内容简介: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 播放音频轨道》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Hackers

Hackers

Steven Levy / O'Reilly Media / 2010-5-30 / USD 21.99

This 25th anniversary edition of Steven Levy's classic book traces the exploits of the computer revolution's original hackers -- those brilliant and eccentric nerds from the late 1950s through the ear......一起来看看 《Hackers》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具