JLayer - декодирование моно MP3 в PCM
Я знаю, что есть похожие посты, но ни один из них не позволил мне решить мою проблему. У меня есть приложение для Android, которое получает через WebSocketClient небольшой моно-байтовый массив MP3. Мне нужно в моем приложении, чтобы записать эти массивы в мою аудио дорожку, чтобы звук сразу же услышал в приложении. Прямо сейчас я могу получить голос, который отправляется с некоторой задержкой (примерно 300 мс), но я получаю "роботизированный голос".
Чтобы понять, откуда исходит этот эффект, я использовал осциллограф и изучил исходный звук по сравнению с моим. Кажется, у меня так: ДАННЫЕ - нет данных - ДАННЫЕ - нет данных. Я подумал, что это проблема декодирования (я использую JLayer). Я предполагаю, что JLayer только хорошо декодирует стерео mp3 в PCM, но имеет странное поведение при декодировании моно mp3 в PCM. Я знаю, что у некоторых людей была такая же проблема, но их решения, похоже, не сработали для меня.
Вот мое событие "onReceive", которое получает данные byte[] и превращает их в pcm, прежде чем добавить их в AudioTrack.
@Override
public void onBinaryReceived(byte[] data) {
try {
Decoder decoder = new Decoder();
ByteArrayInputStream bis = new ByteArrayInputStream(data);
Bitstream bits = new Bitstream(bis);
SampleBuffer buff = (SampleBuffer) decoder.decodeFrame(bits.readFrame(), bits);
player.write(buff.getBuffer(), 0, buff.getBufferLength());
bits.closeFrame();
} catch (DecoderException e) {
e.printStackTrace();
} catch (BitstreamException e) {
e.printStackTrace();
}
}
Я нашел пост об этой теме, и это, видимо, было решением:
так и должно быть. Но если входной mp3 - Mono, я получаю такое же количество сэмплов в pcmbuffer. Но это не так: monochannel, 0, monochannel, 0 Все данные находятся в первой половине pcmbuffer, а во второй половине все 0. Итак, вам просто нужно обрезать вторую половину.
Проблема в том, что я понятия не имею, как я могу "отрезать вторую половину" моего pcmBuffer.