Воспроизведение данных mp3, сжатых хромым mp3 с JLayer и Audiotrack в android

Я следовал этому примеру, чтобы преобразовать необработанные аудиоданные, поступающие из 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, так как для этого требуется файл или файловый дескриптор.


person Ichigo Kurosaki    schedule 21.01.2014    source источник
comment
AudioRecord предоставляет данные PCM, а AudioTrack воспроизводит данные PCM. Итак, если вам не нужно сохранять звук в файл, зачем вы его кодируете в формате mp3? (даже если вам по какой-то причине нужно закодировать его в формате mp3, вы все равно можете взять те же данные PCM, которые вы передаете в кодировщик, и записать их в AudioTrack).   -  person Michael    schedule 21.01.2014
comment
Причина в том, что мне нужно передавать данные по сети, а простые данные pcm вызывают отправку большого количества данных (4K на образец), а mp3 требует (максимум 500 байт), поэтому отправитель отправляет данные mp3, а получатель получает эти данные mp3 непрерывно как ручей.   -  person Ichigo Kurosaki    schedule 21.01.2014
comment
Хорошо, но последняя часть моего предыдущего комментария все еще применима.   -  person Michael    schedule 21.01.2014


Ответы (2)


просто совет, но постарайтесь

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

после вашего напишите код. Я обрабатываю MP3 так же, как и вы, но закрываю буферы после использования, и у меня нет проблем.
Второй совет - делайте это в потоке или любом другом фоновом процессе. Как вы упомянули эти глухие 2 секунды, медиаплеер может ждать, пока вы обработаете весь поток, потому что вы загружаете его в одном потоке.
Попробуйте оба совета (и вы все равно должны). Во-первых, проблема могла быть во внутренних буферах; Во-вторых, вы, вероятно, заполнили входной буфер Media и заблокировали приложение (тот же поток, полный буфер не может получить ваш ввод, а код для его воспроизведения и освобождения того же буфера не вызывается, потому что запись блокирует его ...)
Кроме того, если вы не Не делайте этого сейчас, проверьте 'frameHeader == null' из-за конца файла. Удачи.

person zegee29    schedule 05.02.2018

Вам нужно перебрать кадры следующим образом:

While (frameHeader = bitstream.readFrame()){
    SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
    short[] pcm = output.getBuffer();
    player.write(pcm, 0, pcm.length);
    bitstream.close();
}

И убедитесь, что вы не запускаете их в основном потоке (вероятно, это причина зависания).

person SafalFrom2050    schedule 04.09.2018