Я следовал этому примеру, чтобы преобразовать необработанные аудиоданные, поступающие из AudioRecord, в mp3, и это произошло успешно, если я сохраните эти данные в файле mp3 файл и играйте с музыкальным плеером, после чего это будет слышно.
Теперь мой вопрос заключается в том, что вместо сохранения 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);
Но мой код зависает в bitstream.readFrame через 2-3 секунды, также до этого не воспроизводится звук.
Есть предположения, в чем будет проблема? Любое предложение приветствуется.
Примечание. Мне не нужно хранить данные mp3, поэтому я не могу использовать MediaPlayer, так как для этого требуется файл или файловый дескриптор.
AudioRecord
предоставляет данные PCM, аAudioTrack
воспроизводит данные PCM. Итак, если вам не нужно сохранять звук в файл, зачем вы его кодируете в формате mp3? (даже если вам по какой-то причине нужно закодировать его в формате mp3, вы все равно можете взять те же данные PCM, которые вы передаете в кодировщик, и записать их вAudioTrack
). - person Michael   schedule 21.01.2014