Android 音视频开发 二 AudioTrack播放pcm

2018-07-28  本文已影响144人  CHSmile

AudioTrack允许PCM音频缓冲器流到音频接收器进行回放。这是通过“推”的数据对象的信号使用 write(byte[], int, int) and write(short[], int, int) 方法。
一个信号可以在两种模式下运行:静态或流。

在流模式中,应用程序写一个连续的数据流的信号,采用write()方法。这些都是封闭和返回时,数据已经从java层转移到本地层排队等候播放。在播放音频数据块时,流模式最为有用:
由于播放声音的持续时间太大而不适合于记忆,因为音频数据的特性(采样率高)

在处理适合于内存的短声音时,应该选择静态模式,并且需要以最小的延迟进行播放。因此,静态模式更适合于经常播放的UI和游戏声音,并且可能开销最小。
在创作中,一个声道对象初始化其相关音频缓冲区。这个缓冲区的大小,规定在施工过程中,确定多长时间的信号可以跑出来的数据之前玩。
使用静态模式的信号,这是声音的大小,可以发挥它的最大尺寸。
对于流模式,数据将被写入音频接收器,其大小小于或等于总缓冲区大小。信号不是终点,从而允许子类,但不推荐使用。

static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)

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

其实这个和AudioRecord一样的道理,因为是播放,所以播放文件存在,直接读取文件,通过流的形式一次一次的读取数据,同时播放

首先创建AudioTrack
bufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
接着
track.play()
然后循环读取数据,读完了就stop(),自己中断的话就停止循环

 track.play();
 //writeToFileHead();
 while (isStart) {
     if (null != track&&dis.available() > 0) {

         int i = 0;
         while (dis.available() > 0 && i < buffer.length){
                  buffer[i] = dis.readShort();
                  i++;
         }
       track.write(buffer,0,buffer.length);
    }
}
track.stop();

需要注意的是资源的及时释放

if (track != null) {
     if (track.getState() == AudioRecord.STATE_INITIALIZED) {
        track.stop();
     }
    if (track != null) {
        track.release();
    }
}
if (dis != null) {
    dis.close();
}
上一篇 下一篇

猜你喜欢

热点阅读