将AudioTrack与JLayer解码器配合使用

时间:2014-02-15 18:17:07

标签: android android-asynctask mp3 audiotrack jlayer

我正在使用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播放器的最佳方法是什么?

1 个答案:

答案 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?