内容简介:Amit Trivedi:《Naina Da Kya Kasoor》电影:《调音师》插曲
Amit Trivedi:《Naina Da Kya Kasoor》
电影:《调音师》插曲
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 是所有设备都支持的采样频率。
「图片来自Google」
量化: 模拟信号经过采样成为离散信号,离散信号经过量化成为数字信号。 量化是将经过采样得到的离散数据转换成二进制数的过程,量化深度表示每个采样点用多少比特表示,在计算机中音频的量化深度一般为4、8、16、32位(bit)等。
量化深度的大小影响到声音的质量,显然,位数越多,量化后的波形越接近原始波形,声音的质量越高,而需要的存储空间也越多;位数越少,声音的质量越低,需要的存储空间越少。CD音质采用的是16 bits,移动通信 8bits。
另外,WAV 文件其实就是 PCM 格式,因为播放 PCM 裸流时,我们需要知道 PCM 的采样率, 声道数, 位宽等信息,WAV 只是在文件头前添加了这部分描述信息, 所以 WAV 文件可以直接播放。
「WAV 文件头/图片来自Google」
PCM 是音频处理中频繁接触的格式,通常我们对音频的处理都是基于 PCM 流,如常见的音量调节, 变声, 变调等特性。
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
05 结束语
关注 GeekDev 公众号你将在第一时间获取最新内容。 如果你想了解更多信息, 可关注微信公众号 ( GeekDev ) 并回复 资料 获取。
往期内容:
MediaCodec/OpenMAX/StageFright 介绍
下期预告:
《 AVPlayer 添加音效 》
◆ ◆ ◆
以上所述就是小编给大家介绍的《使用 AudioTrack 播放音频轨道》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 银河水滴亮相柏林轨道交通展,正式进军智能轨道交通
- AI助力轨道交通升级,银河水滴轨检车开进国际轨道交通展
- SARscape中高分三号数据轨道纠正
- SARscape中导入外部GCP点用于轨道精炼
- Go正走在成为下一个企业级编程语言的轨道上
- 声网 Agora 音频互动 MoS 分方法:为音频互动体验进行实时打分
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。