我遵循此示例将来自AudioreCord的原始音频数据转换为MP3,如果我将此数据存储在文件中,则成功地发生了可听见。
现在,我的问题是,我需要将MP3数据存储到我需要使用Audiotrack播放的文件中,而是从Red5 Media Server作为实时流来播放数据,但是问题是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上冻结,此后也没有产生声音。
有什么猜测会有什么问题?任何建议都将不胜感激。
NOTE :我不需要存储MP3数据,因此我不能使用MediaPlayer,因为它需要文件或归档的文字。
只是一个提示,但尝试
output.close();
bitstream.closeFrame();
您写代码后。我正在处理MP3和您一样,但是我在使用后关闭缓冲区,但我没有问题。第二提示 - 在线程或任何其他背景过程中进行。正如您提到的这些聋人2秒钟,媒体播放器可能会等到处理整个流,因为您将其加载到同一线程中。
尝试这两个技巧(无论如何您都应该)。起初,问题可能是内部缓冲区;第二,您可能会满足媒体的输入缓冲区和锁定的应用程序(相同的线程,完整的缓冲区无法接收您的输入和代码来播放它,并且不调用相同的缓冲区,因为编写锁...)
另外,如果您现在不这样做,请检查由于文件结束而引起的" 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();
}
并确保您没有在主线程上运行它们。(这可能是冻结的原因。)