android中pcm数据的播放(AudioTrack)

简介

在android中java层提供了SoundPool、MediaPlayer、AudioTrack三种音频播放方式,其中SoundPool适合短促且对反应速度比较高的情况(游戏音效或按键声等),MediaPlayer适合比较长且时间要求不高的情况,比如播放mp3、aac等文件,而AudioTrack可播放解码后pcm的裸流。

使用方式

1. 先计算最小缓冲区大小

int bufferSize = AudioTrack.getMinBufferSize(16000,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
//函数原型为static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat);

getMinBufferSize函数的第一个参数为音频采样率、第二个参数为声道数、第三个参数表示每个采样点的位数。

2. 新建AudioTrack对象

  AduioTrack audioTrack= new AudioTrack(AudioManager.STREAM_MUSIC, 16000, AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);
//函数原型为:  public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes, int mode)

参数说明:

streamType:音频类型,如STREAM_ALARM、STREAM_MUSCI、STREAM_RING、STREAM_SYSTEM等;目的是可对不同类型的音频分别管理。

sampleRateInHz:采样率;

channelConfig: 声道数;

audioFormat: 采样点位数;

bufferSizeInBytes: 缓冲区大小,利用getMinBufferSize得到的值;

mode:包括MODE_STATIC和MODE_STREAM。其中MODE_STATIC表示一次性将所有音频数据传送给AudioTrack,适用于数据量小、延时要求高的音频;MODE_STREAM模式下将会通过write分多次将音频数据写到AudioTrack中,有一定的延时。

3. 开始播放

audioTrack.play();

4. 写入数据

audioTrack.write(buffer, 0, buffer.length);

5. 结束播放

audioTrack.stop();
audioTrack.release();

测试数据

可通过ffmpeg命令将mp3格式转换成pcm,如:

ffmpeg -i test.mp3 -f s16be -ar 16000 -ac 1 -acodec pcm_s16le pcm16k.pcm
说明:

-acodec pcm_s16le:输出pcm格式,采用signed 16编码,字节序为小尾端(大尾端为be);
-ar 16000: 采样率为16000
-ac 1: 声道数为1

你可能感兴趣的:(andorid,pcm)