2014-01-21 51 views
1

我跟着這個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。

+0

'AudioRecord'給你PCM數據,'AudioTrack'播放PCM數據。所以如果你不需要將音頻保存到一個文件中,爲什麼你要對它進行編碼? (即使由於某種原因需要對mp3進行編碼,仍然可以採用與編碼器相同的PCM數據並將其寫入'AudioTrack')。 – Michael

+0

原因是我需要通過網絡傳輸數據,普通的PCM數據導致大量的數據發送(每個樣本4K)和MP3需要(最多500字節),所以發送者發送MP3數據和接收器接收這個MP3數據連續流。 –

+0

好的,但我以前的評論的最後一部分仍然適用。 – Michael

回答

0

只是一個提示,但儘量

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

後你寫的代碼。我正在處理MP3,但是我在使用後關閉了緩衝區,我沒有問題。
第二個提示 - 在線程或任何其他後臺進程中執行。正如您提到這些聾人2秒鐘,媒體播放器可能會等到您處理整個流時,因爲您正在將它加載到同一個線程中。
嘗試兩個提示(無論如何你應該)。首先,問題可能在內部緩衝區中;在第二個你可能履行媒體的輸入緩衝區,你鎖定的應用程序(相同的線程,完整的緩衝區不能接收您的輸入和代碼播放它,並釋放相同的緩衝區不會被調用,因爲寫入鎖定它...)
此外,如果你不'現在就做,由於文件結束,請檢查'frameHeader == null'。 祝你好運。