我跟着這個example轉換來自AudioRecord原始音頻數據爲MP3,並且它成功發生,如果我將這個數據存儲在一個文件的MP3文件和播放與音樂播放器,然後它是可以聽到的。播放mp3數據壓縮由JLayer和Audiotrack latin mp3在android
現在我的問題是,而不是將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,因爲它需要一個文件或filedescriptor。
'AudioRecord'給你PCM數據,'AudioTrack'播放PCM數據。所以如果你不需要將音頻保存到一個文件中,爲什麼你要對它進行編碼? (即使由於某種原因需要對mp3進行編碼,仍然可以採用與編碼器相同的PCM數據並將其寫入'AudioTrack')。 – Michael
原因是我需要通過網絡傳輸數據,普通的PCM數據導致大量的數據發送(每個樣本4K)和MP3需要(最多500字節),所以發送者發送MP3數據和接收器接收這個MP3數據連續流。 –
好的,但我以前的評論的最後一部分仍然適用。 – Michael