使用 AudioTrack 播放音频轨道

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

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

查看所有标签

猜你喜欢:

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

Scrum精髓

Scrum精髓

Kenneth Rubin / 姜信宝、米全喜、左洪斌、(审校)徐毅 / 清华大学出版社 / 2014-6-1 / CNY 79.00

短短几年时间,Scrum跃升为敏捷首选方法,在全球各地得以普遍应用。针对如何用好、用巧这个看似简单的框架,本书以通俗易懂的语言、条理清晰的脉络阐述和提炼出Scrum的精髓。全书共4部分23章,阐述了七大核心概念:Scrum框架,敏捷原则,冲刺,需求和用户故事,产品列表,估算与速率,技术债;三大角色:产品负责人,ScrumMaster,开发团队以及Scrum团队构成:Scrum规划原则及四大规划活动......一起来看看 《Scrum精髓》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

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

HEX CMYK 互转工具