【问题标题】:Use AudioTrack with JLayer decoder将 AudioTrack 与 JLayer 解码器一起使用
【发布时间】:2014-02-15 18:17:06
【问题描述】:

我正在使用 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 播放器吗?

【问题讨论】:

    标签: android android-asynctask mp3 audiotrack jlayer


    【解决方案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?

    【讨论】:

    • 我同意 SpinalTapFan11。尝试计时您的 JLayer 解码方法。我目前正在使用 JLayer 和 AudioTrack,有两件事可以让我顺利进行。 1) 让您的解码调用接近 AudioTrack 最小缓冲区大小。 2)双缓冲您的解码音频(保持第二个解码缓冲区准备写入并在写入后交换它们/重复)。如果您将解码从与写入相同的异步循环中取出,您的代码会变得更加棘手,但您可以为下一次写入准备好几倍的最小缓冲区大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多