我按照此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/