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结构剖析
文章图片
audio_track架构图.png
每个音频流相应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注冊到 AudioFlinger中。由AudioFlinger把全部的AudioTrack进行混合(Mixer)。然后输送到AudioHardware中进行播放。眼下Android同一时候最多能够创建32个音频流,也就是说。Mixer最多会同一时候处理32个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的内部缓冲区中。适用于播放内存占用小、延时要求较高的音频数据。
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)