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.

0 ответов

Другие вопросы по тегам