我正在使用Android应用程序,它使用JLayer库来解码MP3文件(我需要访问音频样本)和AudioTrack对象来播放它。我有这样的事情:
int timeMarker = 0;
int timeStep = 5000;
while (!isCancelled()) {
outSignalBuffer = decode(fileToPlay.getPath(), timeMarker, timeStep, bufferSize);
audioTrack.write(outSignalBuffer, 0, outSignalBuffer.length);
//publishProgress(outSignalBuffer);
timeMarker += timeStep;
}
此代码放在我的自定义播放器中,创建为AsyncTask。一般来说,我的解码和写入方法工作正常,因为我听到声音文件。问题是,我的声音每5秒钟经常抖动一次(timeStep = 5000 ms)。正如我所看到的,audioTrack.write(...)阻止了我的异步任务,因此每次执行步骤后的短暂停顿是由等待解码方法产生的。
你有什么建议正确提供outSignalBuffer从解码器写入方法以获得流畅的audioTrack播放器的最佳方法是什么?
答案 0 :(得分:1)
您是否尝试过对decode和audioTrack.write函数进行计时以查看阻止Async任务的内容?我不认为audioTrack.write会成为问题。
我对JLayer的体验是它对于实时解码来说太慢了,特别是如果你正在使用CD质量的音频(立体声,44.1kHz采样率)。
如果你可以提高基础SDK,那么Media Codec可能是一个很好的方法:http://developer.android.com/reference/android/media/MediaCodec.html
您还可以查看使用openSL es实现音频。这篇文章讨论了Android音频编程的一些挑战和解决方案:Android audio programming nightmare - soundpool, audiotrack arrghh?