2

我正在使用 JLayer 库来解码 MP3 文件(我需要访问音频样本)和 AudioTrack 对象来播放它的 Android 应用程序。我有这样的事情:

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 毫秒)有规律地跳动。正如我看到的 audioTrack.write(...) 阻止了我的异步任务,因此每次 Steps 之后的短暂暂停是由于等待解码方法的结果引起的。

您有什么建议可以正确传递 outSignalBuffer 以从解码器编写方法以获得流畅的 audioTrack 播放器吗?

4

1 回答 1

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 音频编程噩梦 - soundpool、audiotrack arrghh?

于 2014-03-10T22:48:05.363 回答