Android:使用FileInputStream一次读取1024字节时,AudioTrack无法完全播放PCM音轨

时间:2015-01-07 07:45:00

标签: android fileinputstream pcm audiotrack

我想使用FileInputStream一次读取1024个字节,并将字节缓冲区传递给AudioTrack,它将播放1024个字节。 我把它放在一个while循环中,以便连续播放整个曲目。 您可能会建议您可以立即读取整个PCM,但我不想这样做。 这段代码只播放前1024个字节,然后退出循环。

                    fis = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Notate/" + MainActivity.filepath);
l = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Notate/" + MainActivity.filepath);
                byte[] buffer = new byte[1024];
                try {
                    fis = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Notate/" + MainActivity.filepath);


                    while (fis.read(buffer)!=-1) {

                    int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT);
                    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO,
                            AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM);
                    TextView t1 = (TextView) contentView.findViewById(R.id.textView1);
                    t1.setText(Integer.toString(intSize));
                    if (at != null) {
                        at.play();
                        at.write(buffer, 0, buffer.length);
                        at.stop();
                        at.release();
                    }
                }
                    fis.close();
                } catch (Exception e) {
                }

1 个答案:

答案 0 :(得分:0)

您需要更准确地计算读取实际产生的字节...

来自read(byte [])...

上的文档

<强>返回:

读入缓冲区的总字节数,如果由于文件末尾已到达而没有其他数据,则为-1。

但是你假设已经提供了一个完整的buffer.length?

读取的返回值是NONEoF(-1,1024)的情况在哪里?

您必须通过准确写出上一次读取所传递的长度来解释代码中的边缘情况。