видеокомпьютер

Синхронизация звука и видео при захвате с аналогового источника

некоторые соображения по устранению одной наболевшей проблемы

Эта статья посвящена решению одной из наиболее часто встречающейся проблемы при захвате и оцифровке аналогового видео – рассинхронизации AV потоков при формировании AVI -файла. Суть этой проблемы лежит в несовершенстве контейнера AVI – в нем отсутствует временная привязка потоков, поэтому синхронно проигрываться они будут только в том случае, когда соблюдена "целостность" потоков и скорости их воспроизведения будут соответствовать скорости при записи. На практике выполнение этих двух условий затруднено: скорости потоков при записи часто не соответствует стандартным, применяемым при воспроизведении, а целостность видеопотока часто нарушается неизбежными при захвате с аналоговых источников "дропами" - выпадением отдельных кадров из-за несовершенства аналоговых методов записи-воспроизведения.

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

Суть метода основана на восстановлении целостности видеопотока добавлением недостающих (или удалением ошибочно добавленных механизмами обработки дропов) кадров, а также коррекции длительности аудио-потока при сохранении стандартной частоты дискретизации. Несмотря на некоторую громоздкость изложения и связанное с этим естественное чувство "А ну его нафик – сложно очень!", вся работа реально занимает от силы 15-20 минут, а результат вас безусловно порадует :)

Для захвата нам понадобится бесплатная программа VirtualVCR – это не реклама продукта, просто это единственная (на данный момент) программа, которая способна записать в текстовый файл лог по статистике захвата. И благодаря этому логу, можно минимальными усилиями найти в захваченном клипе те "проблемные" места, которые требуют нашей коррекции. Для создания лога нужно включить опцию Log AV offset to "AVdiff.txt" file в настройках программы. Опции Resample Audio и Master Stream in AVI file должны быть отключены. Параметры звука и видео должны соответствовать стандартным значениям: 25FPS(PAL)/30FPS(NTSC) для видео и 48000Hz 16bit для аудио. После захвата, не выходя из VirtualVCR, желательно открыть список дропов и скопировать его в файл – это может помочь в дальнейшем анализе.

Итак, видеоклип записан в файл AVI на жестком диске компьютера. Следующим этапом будет анализ логов. Для этого мы находим файл AVdiff.txt (обычно он сохраняется в туже папку, где находится AVI) и открываем его в MS Excel. Здесь нас интересуют две колонки данных: Time – время замера в миллисекундах и Video – замеренный средний FPS. Эти данные требуют некоторых преобразований: для наших целей усредненное по времени захвата значение FPS не подходит, нам нужен текущий FPS, усредненный по интервалу между замерами. Кроме того, время для наглядности имеет смысл перевести в секунды, а еще лучше вывести номер  текущего кадра. Формулы пересчета простые:

 

Framen = Videon * Timen /1000

FPSn = 1000 * (Framen - Framen-1) / (Timen - Timen-1)

На основе полученных данных строим график, показывающий изменения FPS по длине клипа во время захвата:

Комментарии тут, как говориться, излишни: на фоне стабильного FPS ~25 мы видим неожиданные выбросы, свидетельствующие о нарушениях в потоке кадров.

Так как интервал замеров в логе VirtualVCR составляет ~1 сек, то значение FPS (точнее отклонение от номинального значения) непосредственно говорит нам о количестве кадров подлежащих коррекции.Так в первой точке (Frame=3256) мы видим FPS=24, т.е. одного кадра в потоке здесь явно не хватает. Стало быть, в диапазоне кадров 3232-3256 нам необходимо добавить один кадр. Это делается дублированием любого кадра диапазона, но, если сцена динамичная, пропущенный кадр легко определить по характерному подергиванию видеоряда.

Вторая точка интереснее: здесь мы видим 7 лишних кадров в диапазоне 12327-12384. Если посмотреть на список дропов, который мы записали после захвата, мы сразу увидим виновников: кадры 12334-12345, помеченные как дропы, оказались лишними. Скорее всего, причиной оказались ошибки механизма детектирования дропов. Соответственно эти 7 кадров мы просто удаляем. Аналогично поступаем в третьей точке (там имеет место быть "ложный дроп" #23230).

Следует заметить, что в DirectX 9.0b есть механизм, который, в случае недопустимой задержки очередного кадра вставляет на его место дубль предыдущего (D-frame), которые можно увидеть в VirtualDub как Drop Frame. Всего в списке дропов этого клипа было обозначено 76 кадров. Как видно из графика, лишними из них оказались 8, остальные 68 соответствовали реальным дефектам исходной записи и были скорректированы при захвате.

Дублирование и удаление лишних кадров доступно в любом видеоредакторе, лично я это делаю в VirtualDub.

После восстановления целостности видеопотока необходимо привести длительности аудио и видео к одному значению. Так как претензий к видео у нас больше нет, коррекции подлежит звук. Нужную длительность аудиопотока определить очень просто: умножаем общее количество кадров откорректированного видео на 40мкс для PAL или 33.(33) мкс для NTSC. В данном клипе исходное количество кадров (включая дропы) составляло 25619 кадров, с учетом проведенной коррекции получилось 25619+1-7-1=25612. Соответственно длительность аудио для синхронного воспроизведения должна составлять 25612*0.04=1024.48сек (00:17:04.48). Коррекцию аудио (ресемплирование) лучше делать в специализированных редакторах, я пользуюсь известным SoundForge применяя в нем фильтр Time StretchПосле обработки сохраняем аудиопоток в WAV-файл.

Здесь необходимо отметить, что коррекция длительности аудиопотока может и не потребоваться: после компенсации дропов длительности потоков часто оказываются приблизительно равными. Тем не менее, на продолжительных клипах,  длительности потоков могут заметно отличаться из-за отклонений кадровой частоты источника видео и опорного генератора АЦП звуковой карты.

В итоге всей нашей деятельности мы получаем равномерный видеопоток 25FPS и соответствующий ему по длительности аудиопоток 48кГц. Соединив их в любом редакторе, мы получим полностью синхронный клип со стандартными параметрами – и наша цель наконец достигнута.

Опубликовано TAB 01.08.2004 г. любое использование материалов статьи допускается только с разрешения автора

Hosted by uCoz