Android|Android AudioTrack详解

MediaPlayer和AudioTrack的关系
我们知道播放声音能够用MediaPlayer和AudioTrack,MediaPlayer会在framework层创建相应的音频解码器。而AudioTrack仅仅能播放已经解码的PCM流,MediaPlayer在framework层还是会创建AudioTrack,把解码后的PCM数流传递给AudioTrack。AudioTrack再传递给AudioFlinger进行混音,然后才传递给硬件播放,所以是MediaPlayer包括了AudioTrack

int sampleRateInHz=32000; int nb_channels=2; //固定格式的音频码流 int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //声道布局 int channelConfig; if(nb_channels == 1){ channelConfig = android.media.AudioFormat.CHANNEL_OUT_MONO; }else if(nb_channels == 2){ channelConfig = android.media.AudioFormat.CHANNEL_OUT_STEREO; }else{ channelConfig = android.media.AudioFormat.CHANNEL_OUT_STEREO; }int bufferSizeInBytes = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC,// 指定流的类型 sampleRateInHz,// 设置音频数据的採样率 32k,假设是44.1k就是44100 channelConfig,// 设置输出声道为双声道立体声,而CHANNEL_OUT_MONO类型是单声道 audioFormat,// 设置音频数据块是8位还是16位。这里设置为16位。 bufferSizeInBytes,//缓冲区大小 AudioTrack.MODE_STREAM // 设置模式类型,在这里设置为流类型,第二种MODE_STATIC貌似没有什么效果 ); audio.play(); // 启动音频设备。以下就能够真正開始音频数据的播放了 // 打开mp3文件,读取数据,解码等操作省略 ... byte[] buffer = new buffer[4096]; int count; while(true) { // 最关键的是将解码后的数据,从缓冲区写入到AudioTrack对象中 audio.write(buffer, 0, 4096); if(文件结束) break; } //关闭并释放资源 audio.stop(); audio.release();

AudioTrack结构剖析
Android|Android AudioTrack详解
文章图片
audio_track架构图.png
每个音频流相应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注冊到 AudioFlinger中。由AudioFlinger把全部的AudioTrack进行混合(Mixer)。然后输送到AudioHardware中进行播放。眼下Android同一时候最多能够创建32个音频流,也就是说。Mixer最多会同一时候处理32个AudioTrack的数据流。
Android|Android AudioTrack详解
文章图片
示意图.png 参数解读
streamType:音频流类型
STREAM_ALARM、 STREAM_MUSIC、 STREAM_RING、 STREAM_SYSTEM、 STREAM_VOICE_CALL、 STREAM_NOTIFICATION、 STREAM_BLUETOOTH_SCO、 STREAM_BLUETOOTH_SCO

sampleRateInHz:採样率 在4000到48000之间
channelConfig:音频声道
CHANNEL_OUT_DEFAULT、CHANNEL_OUT_MONO、CHANNEL_CONFIGURATION_MONO ---> CHANNEL_OUT_MONO CHANNEL_OUT_STEREO、CHANNEL_CONFIGURATION_STEREO---> CHANNEL_OUT_STEREO

audioFormat:音频格式
ENCODING_PCM_16BIT、ENCODING_DEFAULT ---> ENCODING_PCM_16BIT ENCODING_PCM_8BIT ---> ENCODING_PCM_8BIT

bufferSizeInBytes缓冲区大小: mode:音频数据载入模式 【Android|Android AudioTrack详解】AudioTrack有两种数据载入模式:
1.MODE_STREAM
在这样的模式下,应用程序持续地write音频数据流到AudioTrack中,而且write动作将堵塞直到数据流从Java层传输到native层,同一时候增加到播放队列中。这样的模式适用于播放大音频数据,但该模式也造成了一定的延时;
2.MODE_STATIC
在播放之前,先把全部数据一次性write到AudioTrack的内部缓冲区中。适用于播放内存占用小、延时要求较高的音频数据。

    推荐阅读