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 AudioTrack详解_第1张图片
audio_track架构图.png

每个音频流相应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注冊到 AudioFlinger中。由AudioFlinger把全部的AudioTrack进行混合(Mixer)。然后输送到AudioHardware中进行播放。眼下Android同一时候最多能够创建32个音频流,也就是说。Mixer最多会同一时候处理32个AudioTrack的数据流。

Android AudioTrack详解_第2张图片
示意图.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:音频数据载入模式

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

你可能感兴趣的:(Android AudioTrack详解)