Android 音频渲染之AudioTrack

Android平台下的音频渲染在java层有三个API,分别是MediaPlayer、SoundPool和AudioTrack ,它们的使用场景如下:

  • MeidaPlayer : 适合在后台长时间播放本地音乐文件或者在线的流式媒体文件,封装的比较好,使用相对较简单,但是可操作性差。
  • SoundPool:适合播放比较短的音频片段,如对讲开启声、按键声等,可以同时播放多个音频。
  • AudioTrack:适合低延迟的播放,提供了强大的控制能力,适合流媒体的播放。是叫底层的接口,可操作性强。

下面重点介绍一下AudioTrack:

关于AudioTrack

AudioTrack是较底层的接口,只支持裸数据即PCM数据,对于一个压缩的音频数据,需要先解码成pcm数据。
AudioTrack的使用流程:

1、配置AudioTrack实例。
2、调用play方法,将AudioTrack切换到播放状态。
3、启动播放线程,循环向AudioTrack的缓冲区写入数据。
4、当数据写完或停止播放时,停止播放线程,并释放所有资源。

一、配置AudioTrack实例

AudioTrack的构造函数:

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode)

参数说明:

  • streamType:音频流类型,如STREAM_VOICE_CALL电话声音、STREAM_RING铃声和STREAM_MUSCI音乐声等等。
  • sampleRateInHz:采样率,一般为8K~48K;
  • channelConfig:声道数;
  • audioFormat:采样格式,如ENCODING_PCM_16BIT等;
  • bufferSizeInBytes:AudioTrack内部音频缓冲区大小,由于安卓手机众多,可以通过getMinBufferSize来获取;
  • mode:播放模式MODE_STATIC和MODE_STREAM,MODE_STATIC需要一次性写入所有音频数据,MODE_STREAM按照一定时间不断的写入音频数据,一般选用MODE_STREAM;
二、将AudioTrack切换到播放状态

如果AudioTrack初始化成功,就可以调用它play方法,切换到播放状态,代码如下:

if(audioTrack != null && audioTrack.getState() != AudioTrack.STATE_UNINITIALIZED) {audioTrack.play();}
三、启动线程,写入音频数据

创建一个播放线程,代码如下:

PlayerThread playerThread = new PlayerThread();
playerThread.start();
....
class PlayerThread extends Thread {
        private short[] samples;
        
        @Override
        public void run() {
            samples = new short[minBufferSize];
            while (!isStop) {
                int actualSize = decoder.readSamples(samples);//解码成pcm数据
                audioTrack.write(samples,actualSize);
            }
        }
    }
四、播放完毕后需要销毁资源
if(audioTrack != null && audioTrack.getState() != AudioTrack.STATE_UNINITIALIZED){
	audioTrack.stop();
}
isStop = true;
if(playerThread != null) {
	playerThread.join();
	playerThread = null;
}
audioTrack.release();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值