ExtAudioFileSeek, за которым следует ExtAudioFileRead, возвращающий много последовательных отсчетов 0 (невозможно) - PullRequest
2 голосов
/ 02 апреля 2012

Я пытаюсь написать визуализатор формы волны для iPhone, и у меня возникла интересная проблема с ExtAudioFileRead.

Я читаю из файла VBR MP3.Мой клиентский формат - 44,1 кГц LPCM, моно.

Я буду стремиться к позиции, которую я хотел бы визуализировать, и прочесть в 1024 кадрах.То, что я вижу, это то, что в 70% или 80% случаев я получаю нули назад для первых 512 или около того кадров.Чтение сообщает, что оно успешно прочитало все запрошенные кадры.

Кроме того, я подтвердил, что ищу правильную позицию.Если я помещаю результаты чтения в аудио-очередь, это явно правильная позиция в файле.

Так что же дает?Любые мысли о том, почему это может иметь место?Я не могу найти ничего в документах, касающихся этой проблемы.

1 Ответ

3 голосов
/ 04 апреля 2012

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

ДонНе знаю наверняка, почему это решение работает, но у меня есть теория (на случай, если кто-то читает это)

В сжатом формате аудиофайл разбивается на пакеты.Кадры в среднем пакете требуют, чтобы любые предыдущие кадры (из того же пакета) были декодированы, чтобы их можно было понять.

Следующее предположение

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

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

...