在Android中用JLayer和Audiotrack播放由lame mp3压缩的mp3数据

问题描述 投票:2回答:2

我已经按照这个example将来自AudioRecord的原始音频数据转换为mp3,并且它发生成功,如果我将这些数据存储在mp3文件的文件中并与音乐播放器一起播放然后它是可听见的。

现在我的问题是不是将mp3数据存储到我需要用AudioTrack播放的文件中,数据来自Red5媒体服务器作为实时流,但问题是AudioTrack只能播放PCM数据,所以我只能听到噪音从我的数据。

现在我使用JLayer来完成我的需求任务。

我的代码如下。

int readresult = recorder.read(audioData, 0, recorderBufSize);
int encResult = SimpleLame.encode(audioData,audioData, readresult, mp3buffer);

并且这个mp3buffer数据由Red5流发送给其他用户。

在其他用户处接收的数据是流的形式,因此对于播放它的代码是

    Bitstream bitstream = new Bitstream(data.read());
    Decoder decoder = new Decoder();
    Header frameHeader = bitstream.readFrame();
    SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
    short[] pcm = output.getBuffer();
    player.write(pcm, 0, pcm.length);

但是我的代码在2-3秒后冻结在bitstream.readFrame上,之前也没有声音产生。

有什么猜测会有什么问题?任何建议表示赞赏。

注意:我不需要存储mp3数据,所以我不能使用MediaPlayer,因为它需要一个文件或文件描述符。

android audio lame audiotrack jlayer
2个回答
0
投票

只是一个提示,但尝试

output.close();
bitstream.closeFrame();

在您编写代码之后。我正在处理与你相同的MP3,但我在使用后关闭缓冲区,我没有问题。 第二个提示 - 在Thread或任何其他后台进程中执行此操作。正如你提到这些聋2秒,媒体播放器可能会等到你处理整个流,因为你在同一个线程中加载它。 尝试这两个提示(无论如何你应该)。首先,问题可能在于内部缓冲;在第二个你可能完成媒体的输入缓冲区和你锁定的应用程序(相同的线程,完整的缓冲区无法接收您的输入和代码来播放它并释放相同的缓冲区不会被调用,因为写入锁定它...) 此外,如果您现在不这样做,请检查由于文件结束而导致的'frameHeader == null'。祝好运。


0
投票

你需要像这样循环框架:

While (frameHeader = bitstream.readFrame()){
    SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
    short[] pcm = output.getBuffer();
    player.write(pcm, 0, pcm.length);
    bitstream.close();
}

并确保你没有在主线程上运行它们。(这可能是冻结的原因。)

© www.soinside.com 2019 - 2024. All rights reserved.