2011-02-23 1 views
2

Я разрабатываю фильтр звукового декодера DirectShow для декодирования аудио AC3. фильтр используется в реальном графике, декодирует многоадресную рассылку TS. demuxer (mainconcept) предоставляет мне аудиоданные demuxed, но не предоставляет временные метки для образца.установка временных меток для аудиозаписей в directshow graph

Как я могу получить/вычислить правильную метку времени звука?

ответ

1

Каждый кадр AC-3 включает данные для образцов 6 * 256. Частота дискретизации может составлять 32 кГц, 44,1 кГц или 48 кГц (согласно спецификации AC-3 Стандарт цифрового звукового сжатия (AC-3, E-AC-3)). Сами кадры не имеют временных меток, поэтому вам необходимо принимать непрерывные потоки и увеличивать отметки времени соответственно. Поскольку вы упомянули, что источник в прямом эфире, вам может потребоваться повторная настройка временных меток при голоде данных.

Каждый кадр AC-3 имеет фиксированную длину (которую вы можете идентифицировать из заголовка потока бит), так что вы также можете проверить, дает ли демультиплексор один кадр AC-3 или несколько в партии.

2

Я нашел этот пост на форуме:

http://www.ureader.com/msg/14712447.aspx

В нем, член дает следующую формулу для вычисления временных меток для аудио, учитывая его формат (частота дискретизации, количество каналов, бит на выборку) :

С аудио PCM, duration_in_secs = 8 * buffer_size/wBitsPerSample/ nChannels/nSamplesPerSec или duration_in_secs = buffer_size/ nAvgBytesPerSec (с, для аудио PCM, nAvgBytesPerSec = wBitsPerSample * nChannels * nSamplesPerSec/8).

Единственное, что вам нужно добавить это переменная отслеживания, которая говорит вам, что номер образца в потоке, что вы находитесь, так что вы можете использовать его, чтобы компенсировать время начала и окончания времени по длительности (duration_in_secs) при линейной потоковой передаче. Для операций поиска вам, конечно, необходимо знать или рассчитать номер образца в потоке.

Не забывайте, что единицы измерения временных меток в DirectShow набираются как REFERENCE_TIME, длинное целое число или Int64. Каждый блок равен 100 наносекундам. Вот почему в видеофильтрах вы видите, что значение 10 000 000 делится на соответствующее количество кадров в секунду (FPS) для вычисления временных меток для каждого кадра, потому что 10 000 000 равно 1 секунде в переменной REFERENCE_TIME.

 Смежные вопросы

  • Нет связанных вопросов^_^