이 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 데이터를 저장할 필요가 없습니다.
'AudioRecord'는 PCM 데이터를,'AudioTrack'는 PCM 데이터를 재생합니다. 따라서 오디오를 파일로 저장하지 않아도되는 이유는 무엇입니까? (어떤 이유로 mp3로 인코딩해야하는 경우에도 인코더로 보내는 동일한 PCM 데이터를 가져 와서 'AudioTrack'에 쓸 수 있습니다.) – Michael
그 이유는 내가 그물을 통해 데이터를 스트리밍해야합니다, 그리고 일반 pcm 데이터 (샘플 당 4K) 및 mp3 데이터 (최대 500 바이트)가 필요합니다 보낼 많은 데이터를 일으킬 그래서 보낸 사람은 mp3 데이터를 보내고 수신기는이 mp3 데이터를 지속적으로받습니다. 개울. –
그래,하지만 이전 코멘트의 마지막 부분은 여전히 적용되어야합니다. – Michael