在android中使用JLayer和Audiotrack播放lame mp3压缩的mp3数据

在android中使用JLayer和Audiotrack播放lame mp3压缩的mp3数据,android,audio,lame,audiotrack,jlayer,Android,Audio,Lame,Audiotrack,Jlayer,我按照这个步骤将原始音频数据从AudioRecord转换为mp3,并且成功地实现了,如果我将这些数据存储在一个文件中,即mp3文件中,并使用音乐播放器播放,那么它是可以听见的 现在我的问题是,不是将mp3数据存储到需要使用AudioTrack播放的文件中,而是数据以实时流的形式来自Red5媒体服务器,但问题是AudioTrack只能播放PCM数据,因此我只能听到数据中的噪音 现在我已经习惯了我需要的任务 我的代码如下 int readresult = recorder.read(audioDat

我按照这个步骤将原始音频数据从AudioRecord转换为mp3,并且成功地实现了,如果我将这些数据存储在一个文件中,即mp3文件中,并使用音乐播放器播放,那么它是可以听见的

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

现在我已经习惯了我需要的任务

我的代码如下

int readresult = recorder.read(audioData, 0, recorderBufSize);
int encResult = SimpleLame.encode(audioData,audioData, readresult, mp3buffer);
该MP3缓冲区数据通过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,因为它需要一个文件或文件描述符。

只是一个提示,但请尝试

output.close();
bitstream.closeFrame();
在你写代码之后。我和你们一样处理MP3,但我会在使用后关闭缓冲区,我没有问题。
第二个技巧-在线程或任何其他后台进程中执行。正如您刚才提到的2秒钟,media player可能会等到您处理整个流,因为您正在同一个线程中加载它。
试试这两个技巧(无论如何你都应该试试)。首先,问题可能出在内部缓冲区;在第二秒内,您可能完成了媒体的输入缓冲区,并锁定了应用程序(同一个线程,完整缓冲区无法接收您的输入和播放代码,释放相同的缓冲区不会被调用,因为写入会锁定它…
另外,如果您现在不这样做,请检查由于文件结束而导致的“frameHeader==null”。
祝你好运。

你需要像这样在帧之间循环:

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

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

AudioRecord
为您提供PCM数据,并且
AudioTrack
播放PCM数据。那么,如果你不需要将音频保存到文件中,为什么要用mp3编码呢?(即使您出于某种原因需要对其进行mp3编码,您仍然可以将输入编码器的相同PCM数据写入
AudioTrack
)。原因是我需要通过网络传输数据,普通PCM数据会导致发送大量数据(每个样本4K),mp3需要(最多500字节),所以发送方发送mp3数据,接收方以流的形式连续接收mp3数据。好的,但我之前评论的最后一部分仍然适用。