Възпроизвеждане на mp3 данни, компресирани от lame 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 по същия начин като вас, но затварям буфери след използване и нямам проблем.
Втори съвет - направете го в Thread или във всеки друг фонов процес. Както споменахте тези глухи 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