我在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
知道为什么会这样,因为它可以完美地运行某些音频文件。
答案 0 :(得分:1)
确保对write()的调用始终提供字节大小,这是一个整数样本。
对于16位立体声模式,它应该是4个字节的整数倍。
此外,至少在最终写入之前,对于无间断操作,您应该真正尊重音频子系统的最小缓冲区大小,并在每次调用音频写入方法时至少提供那么多数据。
如果源数据是.wav文件,请确保实际跳过标题并仅从有效的有效负载块开始读取样本。