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

标签 android audio lame audiotrack jlayer

我按照此example将从AudioRecord转换为mp3的原始音频数据进行了转换,并且成功发生了,如果我将此数据存储在mp3文件中并使用音乐播放器播放,则可以听见。

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

现在我正在使用JLayer来执行我的require任务。

我的代码如下。

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,因为它需要文件或filedescriptor。

最佳答案

只是一个小费,但尝试

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

在你写代码之后。我正在像处理MP3一样,但是使用后我将关闭缓冲区,并且没有问题。
第二个技巧-在Thread或任何其他后台进程中进行。正如您提到的充耳不闻的2秒钟,媒体播放器可能会等到处理完整个流后,因为您正在将其加载到同一线程中。
尝试两个技巧(无论如何,您都应该)。首先,问题可能出在内部缓冲区中。在第二秒中,您可能满足了Media的输入缓冲区并锁定了应用程序(同一线程,完整的缓冲区无法接收您的输入和代码来播放它,并且释放相同的缓冲区不会被调用,因为写入将其锁定...)
另外,如果您现在不执行此操作,则由于文件结尾而检查“frameHeader == null”。
祝好运。

关于android - 在Android中使用JLayer和Audiotrack播放由lame mp3压缩的mp3数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21254370/

相关文章:

ios - 使用 LAME 将音频文件从 .wav 转换为 MP3 时出现问题

android - 在 android 中使用 Lame 库从 wav 转换 .mp3

android - 使用lame作为库

android - 服务绑定(bind)到 Activity

Android 设备 adb 在 linux/Mac 上始终未经授权

java - 适用于 Android 和 MIDP 的库?

android - DialogFragment - 在何处访问布局组件 [即editText.setText ("")]

file - 为什么我的声音文件没有被复制到?

javascript - 如何将音频附加到提示中?

audio - FFMPEG 和 MP3。如何解码