阅读和播放音频文件

时间:2014-05-01 20:19:24

标签: java android audio

我在Android 2.0.1(摩托罗拉Droid A855)上阅读和播放某些音频片段时遇到了一些麻烦。下面是我使用的代码段。它适用于某些文件,但对于其他文件,它不会退出while循环。我试过检查

InputStream.available()

方法但没有运气。我甚至在卡住之前打印出它正确读取的字节数。它似乎在最后一轮读取时停留在循环中(剩下小于<512字节),并且不会退出循环。

    int sampleFreq = 44100;
    int minBufferSize = AudioTrack.getMinBufferSize(sampleFreq, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
    int bufferSize = 512;
    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, sampleFreq, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);


    InputStream input;
    try {
        File fileID=new File(Environment.getExternalStorageDirectory(),resourceID);
        input = new FileInputStream( fileID);
        int filesize=(int)fileID.length();
        int i=0,byteread=0;     
        byte[] s = new byte[bufferSize];

        at.play();
        while((i = input.read(s, 0, bufferSize))>-1){
             at.write(s, 0, i);
             //at.flush(); 
             byteread+=i;
             Log.i(TAG,"playing audio "+byteread+"\t"+filesize);
        }

        at.stop();  
        at.release();
        input.close();


    } catch (FileNotFoundException e) {
        // TODO
        e.printStackTrace();
    } catch (IOException e) {
        // TODO
        e.printStackTrace();
    }       

音频文件大小约为1-2MB,格式为 wav 。以下是日志记录的示例 -

> : playing audio 1057280   1058474
> : playing audio 1057792   1058474
> : playing audio 1058304   1058474

知道为什么会这样,因为它可以完美地运行某些音频文件。

1 个答案:

答案 0 :(得分:1)

确保对write()的调用始终提供字节大小,这是一个整数样本。

对于16位立体声模式,它应该是4个字节的整数倍。

此外,至少在最终写入之前,对于无间断操作,您应该真正尊重音频子系统的最小缓冲区大小,并在每次调用音频写入方法时至少提供那么多数据。

如果源数据是.wav文件,请确保实际跳过标题并仅从有效的有效负载块开始读取样本。