Что на самом деле означает hip: Can't rewind stream by 74 bit, выводимый mpglib?

Я получаю пару сообщений об ошибках при использовании mpglib для декодирования данных MP3 с использованием среды библиотеки libmp3lame.

error(#1): hip: Невозможно перемотать поток на 74 бита назад!
error(#2): hip: проблема с битовым потоком, повторная синхронизация пропускает 10 байт...

Примечание. В сообщении "повторная синхронизация" указано 10 байтов, то есть 74 бита с округлением в большую сторону: (74 + 7) / 8 = 10.

Мой код декодера MP3 соответствует коду в интерфейсном инструменте LAME (в основном frontend/lame_main.c и frontend/get_audio.c).

Заголовок не генерирует ошибок, и я использую до 100 байтов в соответствии с интерфейсным инструментом (см. функцию lame_decode_initfile() в файле get_audio.c). разница и... не совсем.

Ошибка возникает, когда я начинаю передавать данные MP3 после анализа заголовка.

Есть идеи, почему я получаю эти сообщения об ошибках?

P.S. когда я декодирую с помощью хромого инструмента командной строки, я не получаю ошибку.

$ lame --verbose --decode test.mp3 test-lame.wav
input:  test.mp3  (44.1 kHz, 2 channels, MPEG-1 Layer III)
output: test-lame.wav  (16 bit, Microsoft WAVE)
skipping initial 529 samples (encoder+decoder delay)
Frame# 87426/88167  168 kbps   MS            

Хотя кажется, что между количеством кадров есть несоответствие, но я предполагаю, что это связано с тем, что 88167 было оценочным, а не известным количеством выборок.


person Alexis Wilke    schedule 03.05.2019    source источник


Ответы (1)


Хорошо, я обнаружил, что у меня была ошибка, и я пропускал некоторые байты в буфере. Моя реализация немного сложна, так как я хочу, чтобы данные передавались как можно быстрее, и был один случай, когда я пропустил очистку буфера, прежде чем двигаться вперед.

Поэтому, если вы получаете такую ​​​​ошибку в своем коде, но не запускаете lame в своей консоли, это с вероятностью 99% указывает на ошибку в вашем коде. Будьте терпеливы и посмотрите на свою реализацию и убедитесь на 100%, что вы каждый раз отправляете правильные данные. Если это поможет вам отладить вашу проблему, добавьте подфункцию, которая сохранит то, что вы отправляете в декодер LAME, и сравните это с вашими исходными данными.

Наконец, если вы попытаетесь отправить слишком много данных сразу, знайте, что вы получите аналогичные ошибки. Это связано с тем, что библиотека LAME не кэширует большую часть ваших данных и может возвращать только один кадр.

Со своей стороны я отправляю по 100 байт за раз в функцию hip_decode1_headersB(), пока структура MP3 не установит для поля header_parsed значение true.

Затем я отправляю максимум 1024 (1 КБ) данных за раз на hip_decode1_headers(). Однако использовать его намного сложнее. Вы должны сливать все каждый раз. Чтобы сбросить, вы снова вызываете функцию с указателем данных и длиной, установленной на 0. Функция завершает очистку, когда возвращает 0. Когда у вас больше нет данных и функция возвращает 0, вы закончили распаковку всего вашего набора данных. Данные MP3.

person Alexis Wilke    schedule 24.03.2020