2014-01-21 5 views
1

example을 따라 AudioRecord에서 가져온 원시 오디오 데이터를 mp3로 변환했습니다.이 데이터를 mp3 파일 및 재생 파일에 저장하면 성공적으로 발생했습니다. 음악 플레이어로 들리면 소리가납니다.안드로이드에서 JLayer와 Audiotrack을 사용하여 lame mp3로 음악 재생

이제 내 질문에 AudioTrack로 재생해야하는 파일에 mp3 데이터를 저장하는 대신 데이터가 Live5 스트림으로 Red5 미디어 서버에서 전송되지만 AudioTrack은 PCM 데이터 만 재생할 수 있으므로 문제는 내 데이터에서 잡음 만들을 수 있습니다.

이제는 내 요구 작업에 JLayer을 사용하고 있습니다.

내 코드는 다음과 같습니다.

int readresult = recorder.read(audioData, 0, recorderBufSize); 
int encResult = SimpleLame.encode(audioData,audioData, readresult, mp3buffer); 

이 mp3 버퍼 데이터는 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에 얼어 있도록 다른 사용자에서 수신

데이터 스트림의 형태 .

아무 문제가 될 것이라고 생각하십니까? 모든 제안을 부탁드립니다.

참고 : 파일이나 filedescriptor가 필요하므로 MediaPlayer를 사용할 수 없으므로 mp3 데이터를 저장할 필요가 없습니다.

+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 초를 언급 했으므로 미디어 플레이어는 동일한 스레드에서로드하기 때문에 전체 스트림을 처리 할 때까지 기다릴 수 있습니다.
두 가지 팁을 모두 사용해보십시오 (어쨌든해야합니다). 우선, 내부 버퍼에 문제가있을 수 있습니다. 두 번째로는 아마도 Media의 입력 버퍼를 수행하고 응용 프로그램을 잠근 것입니다 (동일한 스레드, 전체 버퍼는 입력 및 코드를 재생할 수 없으며 쓰기를 잠그기 때문에 동일한 버퍼가 릴리스되지 않습니다)
또한 ' 이제는 파일 끝으로 인해 'frameHeader == null'을 확인하십시오. 행운을 비네.