Краткое руководство по программе VirtualDub

Введение
Архитектура работы
Интерфейс программы
Возможности по обработке видео
Типовые задачи
VirtualDubMod и AviSynth

Введение

Программа VirtualDub должна быть знакома всякому, кто сколько-нибудь серьёзно занимается цифровым видео. Дело в том, что с её помощью можно выполнять множество различных задач из совершенно разных областей – многие даже не подозревают, сколь широк диапазон её возможностей. Итак, попробуем разобраться, чем VirtualDub (часто ласково называемый просто «Дуб») может быть полезен.

Типичные задачи, успешно решаемые с помощью «Дуба», включают в себя:

Немаловажным плюсом является и то, что VirtualDub занимает всего 1-2 мегабайта, не требует установки, распространяется свободно (текущую версию можно скачать здесь). Кстати, последнее обстоятельство привело к тому, что помимо самого VirtualDub, существует ещё ряд его модификаций (VirtualDubMod, VirtualDub-MPEG2 и т.д.), отличающихся дополнительными возможностями.

Архитектура работы

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

VirtualDub нацелен на работу прежде всего с AVI файлами. Точнее, так: на выходе мы получаем AVI файл (хотя есть возможность работы в роли т.н. фреймсервера (frameserver), аналогично утилите AviSynth; модификация VirtualDubMod умеет дополнительно сохранять в контейнеры Matroska (MKV) и OGM), а на вход можно подавать AVI, MPG, AVS и некоторые другие типы файлов. При этом из общих соображений понятно, что AVI на входе и на выходе – это некоторая выделенная ситуация (действительно, в таком случае можно производить обработку без перекодирования – об этом ниже).

AVI файлы, как вы, наверное, знаете, содержат обычно один поток видео и 0, 1 или больше потоков звука. При этом само расширение файла не говорит практически ничего о его содержимом: AVI файл – это всего лишь контейнер, в котором могут храниться данные с различными форматами сжатия. Возможность работы с ними определяется наличием соответствующих кодеков (отдельно для видео и звука). В Windows существует две разные подсистемы работы с видеоданными – более старая Video for Windows (VfW) и более современная DirectShow (DS). И та, и другая предусматривает унифицированный интерфейс работы с любыми форматами сжатия – программа, работающая с видеофайлом, не обязана знать, как именно он закодирован – достаточно, чтобы в системе был зарегистрирован соответствующий модуль декодирования. VirtualDub и многие другие видеоредакторы используют интерфейс VfW, в то время как большинство проигрывателей – технологию DirectShow. Что это означает на практике? Может оказаться так, что какой-либо файл, который прекрасно проигрывается плеером, VirtualDub не сможет открыть, т.к. в системе есть только DS декодер данного формата, но нет VfW кодека (в Video for Windows практически всегда компрессор и декомпрессор идут вместе и называются словом кодек, в то время как в DirectShow часто бывает только декодер). Например, раньше часто можно было встретить ситуацию, когда видео с цифровой камеры miniDV на «чистой» системе проигрывалось с использованием DS декодера от Microsoft, но не открывалось в дубе – требовалось установить VfW кодек, например, от MainConcept или Canopus. (В последних версиях VirtualDub имеется встроенный декодер (но не кодировщик!) для формата DV, также как и для формата MJPG, часто используемого в аппаратных платах аналогового видеозахвата). Отметим ещё, что в противоположном случае, когда для формата сжатия есть только VfW кодек, то он автоматически будет воспроизводиться и в подсистеме DirectShow. Наконец, упомянем, что можно «подружить» дуб и с DirectShow – см.раздел про VirtualDubMod в конце статьи.

Итак, обычно работа в VirtualDub строится следующим образом: открывается видеофайл или несколько файлов, состыковываемые один за другим, с ними производятся какие-либо действия, результат сохраняют в другой AVI файл. Исходные файлы ни при каких условиях не меняются.
Настала пора обратиться к интерфейсу программы.

Интерфейс

Основную часть окна программы занимают два окна, отображающие входной и выходной (после применения фильтров) видеопотоки. (Поскольку фильтры могут менять размер изображения, то в общем случае оба окна неодинаковы по размеру; кроме того, можно вручную установить масштаб, отличный от 100%). Под ними находится линейка прокрутки с подписанными номерами кадров. В отличие от настоящих программ монтажа, в VirtualDub нет ни многодорожечного режима, ни timeline в обычном понимании – только одна полоса прокрутки. Причём если вы удалили какой-либо кусок, то он бесследно исчезает из обращения (впрочем, всегда есть кнопка Undo и команда Edit/Revert all edits, которая сбрасывает все операции с полосой прокрутки). Если вы пристыковали несколько клипов друг к другу, то полоса будет отображать их суммарную длительность. Само собой, перемещением маркера по полосе прокрутки мы добиваемся отображения нужного кадра в обоих окошках. Номер кадра и время, которое ему соответствует, показано чуть ниже, вместе с информацией о типе кадра (в квадратных скобках). Для AVI файлов K обозначает ключевой кадр (Keyframe), пусто – дельта-кадр, D – пропущенный кадр (Dropped frame, в нормальной ситуации таких быть не должно). Для Mpeg файлов исторически обозначения другие: I – ключевой кадр, P – дельта-кадр, B – двунаправленный дельта-кадр. В Avi файлах часто ключевые кадры отстоят друг от друга на несколько сотен кадров, поэтому отображение произвольного кадра потребует распаковки всех дельта-кадров от предыдущего ключевого, что может быть достаточно медленным делом. Для перемотки в файле, кроме двигания маркера мышью, служат курсорные клавиши с различными модификаторами (см. в меню Go), из которых самый полезный – нажатие Shift, позволяющее перемещаться только по ключевым кадрам (также и при движении мышью). Такое перемещение не очень точно, но зато быстро – требуется декодировать только один кадр, а не целую цепочку. Ещё отметим, что Home и End не приводят к перемещению в начало и конец клипа (для этого служат Ctrl+влево/вправо), а отмечают начало и конец фрагмента для обработки. Далее можно либо удалить отмеченный фрагмент кнопкой Del (можно сделать и что-нибудь более конструктивное, например, с помощью Ctrl+C—Ctrl+V скопировать и вставить его в другое место на линейке прокрутки Дуба, но не в другое приложение), либо же при сохранении файла будет обработана только выделенная область.

После того, как вы открыли нужные файлы, вырезали ненужные куски, настроили фильтры и прочие параметры обработки (см.ниже), выбираете File/Save as AVI и запускаете процесс обработки, во время которого на экран выводится индикатор прогресса с дополнительной информацией, а в окошках отображаются кадры исходного и обработанного видео (не все подряд, а раз в секунду, и только в режиме Full processing mode).

При сохранении файла возможны два различных варианта работы: если вся обработка сводится к вырезанию кусков или склейке файлов, либо к замене звука, и при этом исходный файл (файлы) были в формате AVI, то можно и нужно использовать режим без перекодирования (Direct Stream Copy в меню Video). В этом случае сжатые кадры видео напрямую передаются из входного в выходной поток (естественно, без раскодирования и показа на экране), соответственно, качество и размер файла не меняется. Во всех других случаях нужно ставить режим Full Processing Mode и, соответственно, задавать кодек для сжатия (меню Video – Compression) и настроить его параметры (через диалог, вызываемый кнопкой Configure; настройки на общем экране выбора кодеков – Quality и target data rate – в современных условиях чаще всего не применяются).

Есть ещё два промежуточных режима: Fast recompress имеет смысл использовать при перекодировании из одного формата сжатия в другой без наложения фильтров в VirtualDub. В частности, для сжатия видео, подаваемого через Avisynth скрипт. В этом случае также на экран при сохранении может ничего не выдаваться. Режим Normal recompress практически не имеет смысла применять. Аналогичные режимы есть и для звука, только там варианта всего два – прямое копирование и полная обработка (в т.ч. с указанием сжатия и применением звуковых фильтров).

Ещё из полезных особенностей можно отметить возможность отображения в выходном окошке видеоданных, полученных после распаковки сжимаемого видеопотока (Display decompressed output). Таким образом можно оценить качество сжатия и, если оно недостаточно, прервать обработку, не дожидаясь завершения всего процесса. Хотя эта опция замедляет работу и не всегда применима. Также можно полюбоваться работой фильтров без сохранения файла (режим Preview): в этом случае на экран выводятся все кадры, причём если скорость обработки недостаточно высока, то скорость показа будет соответственно меньше нормальной, а звук будет прерываться. Практически такой же результат (проигрывание выходного потока) достигается нажатием кнопки [>O в левом нижнем углу, а кнопка [>I, соответственно, воспроизводит только входной поток.

Возможности по обработке видео

Перейдём к описанию того, что же, собственно, можно делать с видео. Как уже было сказано, кроме возможности резки-склейки файлов без перекодирования (которую мы подробнее разберём в первом примере) VirtualDub славится своими фильтрами. Имеется три десятка встроенных фильтров и возможность подключения внешних плагинов, которых написано довольно много разными людьми. Порою не имеется сопоставимых по качеству аналогов для других программ. (Справедливости ради надо сказать, что в последние годы фокус внимания фильтрописателей сместился в сторону создания плагинов для AviSynth, утилиты, имеющей сходную архитектуру, но совершенно другой интерфейс. Подробнее об этом – в соответствующей статье на сайте). Фильтры можно добавлять в произвольном количестве и порядке через меню Video – Filters:

Рядом с каждым фильтром отображается размер кадра до и после его применения (с учётом обрезки – Cropping), а также некоторые его параметры. Подробное описание фильтров и рекомендации по их применению выходят за рамки данной статьи – да и возможностей столько, что нужно в каждом случае разбираться отдельно, для этого лучше всего обратиться в конференцию. Здесь мы дадим только общие рекомендации. Фильтры можно приблизительно разделить на несколько тематических групп:

Работу фильтра можно ограничить определённым диапазоном кадров (кнопка Blend и команда View/Curve editor). Мы не будем останавливаться на этой возможности (её описание можно найти в справке), а рассмотрим подробнее одну из самых часто используемых функций – масштабирование (resize) и обрезка краёв (crop). В последних версиях этот, в сущности, простой фильтр приобрёл пугающее количество настроек:

На самом деле ничего сложного нет. Нужно иметь в виду, что формат AVI не предусматривает хранения информации о соотношении сторон кадра (Aspect ratio), предполагается, что оно равно соотношению ширины и высоты в пикселях (т.е. «квадратный пиксель»). С другой стороны, в некоторых случаях это не так: самый типичный пример – формат DV, с размером кадра 720х576 (т.е. 5:4) и пропорциями кадра при корректном отображении 4:3 для обычного и 16:9 для широкоэкранного формата. (Поэтому открытый в дубе DV файл будет немного вытянут по вертикали, если не изменить настройки отображения, хотя обычные проигрыватели покажут его правильно). В то же время в файлах DivX/Xvid пиксель обычно квадратный, т.е. при масштабировании DV нужно переключить пункт Aspect ratio с Same as source на Compute height from ratio и задать там 4:3 или 16:9. Ну и общее правило для всех кодеков – желательно иметь ширину и высоту кратную 2, 4, 8, а лучше 16 (для этого служит раздел Codec-friendly sizing).
Что же касается обрезки краёв, то специального фильтра для этого нет – зато есть кнопка Cropping, позволяющая задать обрезку перед применением указанного фильтра. В частности, это может быть фильтр-пустышка Null transform, единственный смысл которого и заключается в сочетании с Cropping. Обрезать, конечно, тоже лучше кратно 2 или 4.

Некоторых комментариев удостоится ещё работа с чересстрочным (интерлейсным) видео. Как известно, в большинстве видеокамер именно этот режим является основным (часто единственным) вариантом, и он отлично сочетается с просмотром на ЭЛТ телевизорах. Если вы собираетесь делать DVD из своего видео, то также лучше всего оставить изображение чересстрочным – при воспроизведении на компьютере или LCD/плазменном телевизоре автоматически будут приняты соответствующие методы деинтерлейса. С другой стороны, если нужно, например, закодировать видео в какой-либо из вариантов MPEG-4 (DivX, Xvid, ...), например, для размещения в интернете, то разумно будет применить деинтерлейс и затем уменьшение размеров кадра (как на скриншоте выше, где ещё добавлена стадия очистки от шума и небольшая обрезка краёв). В качестве метода деинтерлейса не стоит выбирать встроенный фильтр Deinterlace в режиме Blend fields – вопреки надписи best рядом с ним, ничего хорошего, как правило, не выйдет, будут двоящиеся контуры. Лучше воспользоваться сторонними плагинами, хотя и здесь тоже самые современные и качественные разработки существуют только в варианте для Avisynth. И никогда без особых причин не меняйте размер кадра в чересстрочном видео!

Типовые задачи

Теперь опишем некоторые типовые сценарии, в которых VirtualDub применяется для решения специфических задач.

Пример №1: Для начала разберёмся с линейным монтажом, т.е. резкой-клейкой и перестановкой кусков. Как уже было сказано, эту операцию можно проводить без перекодирования, если исходное видео было в контейнере AVI. Добавление нескольких файлов происходит командой File/Append AVI segment, причём если они пронумерованы по порядку, то можно загрузить сразу несколько (галка Autodetect additional segments by filename). При этом форматы сжатия видео и звука должны быть строго одинаковы (вплоть до некоторых параметров, скрытых от пользователя: например, может случиться так, что DV-файл с камеры, обработанный в Dub-е и сжатый опять в DV, нельзя пристыковать к такому же файлу, но полученному непосредственно с камеры.. С другой стороны, файлы, сжатые в DivX одинаковым образом, но с разными битрейтами, спокойно можно склеить). Между прочим, многие (но не все «скрытые») параметры файла можно узнать командой File/File information, хотя более универсальной является отдельная утилита GSpot.
Со «склейкой» разобрались, теперь обратимся к «резке», т.е. удалению ненужных фрагментов (например, рекламы из записи телепередачи), а заодно и к перестановке фрагментов местами (через механизм типа буфера обмена – Ctrl+X, Ctrl+C, Ctrl+V, только в пределах одной программы). Здесь ситуация различается в зависимости от того, сжат файл кодеком с межкадровым (например, DivX/Xvid, VP6, Indeo) или покадровым (MJPG, DV, HuffYUV и т.д.) сжатием. Если во втором случае можно спокойно вырезать любой кусок, т.к. каждый кадр кодируется независимо от других, то в первом ситуация сложнее. Ведь для того, чтобы декодировать некоторый кадр, нужно найти ближайший стоящий перед ним ключевой кадр и пройти всю цепочку от него до нужного кадра. Например, рассмотрим такое выделение:

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

А если мы, наоборот, захотим оставить только этот фрагмент, то полученный видеоряд начинался бы с дельта-кадра, перед которым нет ни одного ключевого, что недопустимо. Поэтому в режиме Direct Stream Copy такая обрезка приведёт к тому, что выходной файл будет начинаться не с 3-го кадра, а с 1-го (ближайшего перед ним ключевого). Аналогично, при попытке убрать следующий фрагмент:

мы получим видеоряд с кадрами с 1 по 4 и с 11 (а не 13) по 15. Отсюда вывод – чтобы не ошибиться в нарезке, делайте это по ключевым кадрам. А именно, если вы удаляете фрагмент, то он должен заканчиваться на ключевом кадре, а если оставляете, то, наоборот, начинаться. Здесь как раз пригодится возможность перемещения только по ключевым кадрам при нажатом Shift. Кстати, отметка конца выделения относится к предыдущему кадру (т.е. выделено всё до текущего, не включая его), поэтому ставить конец надо как раз на сам ключевой кадр.
А что делать, если нужно более точное позиционирование для резки/клейки? В последних версиях Дуба появилась очень полезная галочка Smart Render, активная в режиме Full processing mode. Действие её следующее: если участок может быть обработан в режиме Diect stream copy, то так и происходит, иначе запускается указанный в настройках кодек (он должен быть тем же, с каким сжат исходный файл) и с его помощью кодируется фрагмент вплоть до следующего ключевого кадра (естественно, он начнётся с вновь сделанного ключевого кадра), а на нём опять переключается в режим Direct stream copy.

То есть перекодируются только те участки, которые необходимо. Если правильно сделать все настройки кодека, чтобы они совпадали с исходным файлом (а битрейт лучше задать побольше, чтобы не было резких падений качества на границе фрагментов, и, естественно, установить однопроходный режим сжатия), то этот метод позволяет производить точный покадровый монтаж без лишнего перекодирования, что, безусловно, очень полезно.
Кроме того, есть команда Video/Select range, результат которой сводится к тому, что удаляется участок до первого и после последнего указанного кадра. Связанная с этим задача – разбить длинный файл на куски, например, по 700 мегабайт, для записи на CD, удобнее решается с помощью VirtualDubMod, в котором рядом с номером кадра дополнительно выводится «расстояние» от начала файла в мегабайтах.
Подчеркнём, что резать MPEG-файлы таким образом не получится, для этого удобно использовать MPEG video wizard.

Пример №2: Предположим, вы смонтировали фильм в какой-либо программе монтажа, например Pinnacle Studio или Adobe Premiere. Дальше его нужно как-то сохранить, причём часто бывает нужно иметь его в нескольких вариантах: например, если формат исходной съёмки был miniDV, то разумно готовый фильм из монтажки экспортировать тоже в DV AVI и потом его скинуть обратно на ленту (если камера это позволяет); почти наверняка требуется сделать DVD; может быть, хочется разместить фильм в интернете (даже если вы собираетесь использовать сервис типа YouTube, который сам пережимает видео в свой формат, причём довольно скудного качества, всё равно загружать на сервер исходный DV AVI может быть слишком долго и непроизводительно). В последнем случае имеет смысл готовый DV AVI загрузить в дуб, добавить при необходимости фильтры деинтерлейса и уменьшения размера и сохранить во что-нибудь типа DivX, желательно в два прохода (подробнее об этом можно почитать в достаточно старой, но остающейся концептуально справедливой статье про DivX). Конечно, можно сделать это и непосредственно из монтажной программы, но в этом случае все монтажные эффекты и переходы будут просчитываться два раза, а ведь у нас уже есть DV-AVI файл, подготовленный для записи на камеру.

Пример №3: Допустим, вы снимали в условиях недостаточной освещённости и хотите почистить видео от шумов, или желаете избавиться от дрожания камеры при съёмке с рук. В этих случаях имеет смысл делать выборочную фильтрацию только для тех эпизодов, которые в этом нуждаются (в DVD-камерах каждый эпизод записывается в отдельный файл, при захвате видео с miniDV также, как правило, включают разбиение на сцены с записью каждой сцены в отдельный файл). Желательно проводить обработку перед загрузкой фрагмента в программу монтажа – в этом случае вы можете подбирать и настраивать нужные фильтры отдельно для каждого фрагмента. Впрочем, можно применить и другой ход (реализуемо только в случае AVI файлов с камеры miniDV): смонтировать весь фильм с исходными файлами, а перед окончательным экспортом определить фрагменты, требующие обработки, пропустить их через VirtualDub, исходный файл переместить в архивную папку, а на его место поместить обработанный файл под тем же именем. Затем запустить заново программу монтажа и экспортировать уже с новыми файлами. Обрабатывать видео можно как фильтрами самого VirtualDub, так и через Avisynth, что описано в соответствующей статье. В последнем случае, впрочем, всё равно желательно AVS скрипт загрузить в дуб и сохранить как регулярный AVI файл (например, с тем же кодеком DV) – не все монтажные программы работают с AVS скриптами, да и удобнее работать с готовым файлом, чем с «тяжеловесным» (в смысле времени обработки) скриптом. Стабилизации видео с помощью фильтров VirtualDub и Avisynth будет посвящена отдельная статья.

Пример №4: Нужно сделать скриншот с видео, чтобы разглядеть его на предмет качества или наличия дефектов. Из проигрывателя это делать не стоит, т.к. он может вносить какие-либо модификации в изображение (например, принудительный деинтерлейс или коррекцию яркости). В то же время VirtualDub откроет файл «как есть», при условии, конечно, что он поддерживается им. Кстати, о форматах: по умолчанию, кроме AVI, VirtualDub умеет открывать mpeg-1 файлы. С помощью плагинов от fccHandler'а можно научить его открывать MPEG-2 (кстати, можно открыть и склеить подряд несколько VOB файлов за раз) и WMV/ASF; есть также плагины для работы с MOV и FLV контейнерами, а модификация VirtualDubMod умеет работать с MKV файлами. Остальные форматы можно попробовать открыть с использованием AviSynth (см.ниже). Ну а собственно сохранение скриншотов делается командой File/Export/Image sequence (нужно выделить участок для экспорта – если нужен один кадр, то поместить его под курсор и нажать Home, стрелка вправо, End).

VirtualDubMod и AviSynth

Несколько слов про важную ветвь развития «дуба» – VirtualDubMod. Это отдельная программа, основанная на исходных кодах VirtualDub и множестве полезных добавлений. Её имеет смысл поместить в ту же директорию, что и сам VirtualDub, чтобы использовать общий набор плагинов. (В принципе, можно вообще заменить ей сам дуб, разве что последняя версия DubMod'а основана на версии 1.5.10 от 2005 года, т.е. в ней отсутствуют возможности, добавленные в Dub за последнее время – впрочем, их не так много). Интерфейс VirtualDubMod похож на VirtualDub, одно существенное отличие состоит в том, что меню Audio заменено на Streams, что отражает нацеленность на работу с несколькими аудиопотоками. Второе полезное нововведение заключается в более тесной интеграции с AviSynth. Этой важной программе посвящена отдельная статья на сайте, здесь же нам будет полезно одно её свойство – умение работать с подсистемой DirectShow наряду с VideoForWindows. Вкратце, AviSynth – это скриптовый язык и программа для его интерпретации, а интерфейс его взаимодействия с остальными программами очень прост – вы пишете текстовый файл со скриптом, а затем открываете его в (почти) любой программе видеообработки, кодировщике или проигрывателе, как обычный видеофайл, и работаете точно так же, как с видеофайлом на жёстком диске. Видеоряд и звук формируются командами, записанными в скрипте. Для наших целей достаточно просто установить Avisynth, и тогда при открытии видеофайла в VirtualDubMod будет доступна опция Use Avisynth template:

Это значит, что для открытия файла будет автоматически создан промежуточный AviSynth скрипт, содержащий соответствующую команду открытия (в данном случае DirectShowSource), и уже его загрузит VirtualDubMod. Таким образом можно попытаться работать практически с любыми типами файлов, которые воспроизводятся проигрывателями – RealVideo, QuickTime (MOV), MPEG2-TS (в нём обычно находится видео с видеокамер формата HDV и AVCHD), MP4 (тоже частый вариант в фотокамерах и комбинированных фотовидеокамерах). Надо отметить, что этот способ, во-первых, не всегда работает, во-вторых, не такой надёжный, как открытие «родными» средствами (в частности, может неверно работать позиционирование по файлу и т.д.). Поэтому всегда при возможности лучше пользоваться встроенными или специализированными средствами (MPEG2-PS, в частности, DVD файлы (VOB), открываются непосредственно в VDMod, а для перевода MP4 файлов в AVI существует специальная программа MP4Cam2AVI).
Ещё отметим, что в VirtualDubMod есть специальный Script Editor (в меню Tools), предназначенный для оперативного контроля и настройки параметров AviSynth скрипта. Просто меняйте текст скрипта, а затем нажимайте F5 или F7, чтобы увидеть в окне VirtualDub результат работы скрипта. Подчеркнём, что и обычный VirtualDub прекрасно открывает AVS скрипты, просто в VDMod интеграция с AviSynth более удобная. Нужно помнить, что AviSynth скрипт, открытый в любой программе, представляется несжатым файлом, так что копирование без пересжатия в этом случае невозможно. (Если не требуется дополнительно использовать фильтры VirtualDub, то лучше выбирать режим Fast Recompress, а не Full processing mode)

Короче говоря, VirtualDub (а также VirtualDubMod и Avisynth) должны быть в арсенале всякого, кто работает с цифровым видео на уровне чуть выше стартового. Изучайте и применяйте! В статье были рассмотрены далеко не все возможности VirtualDub, так что читайте Help. Детальное описание пунктов меню есть в статье на 3dnews, впрочем, для достаточно старой версии Дуба. В сети есть также и русскоязычные сборки VirtualDub, правда, может быть, не последних версий.

С пожеланиями творческих успехов,
Евгений Васильев (eugvas@mccme.ru)


Эта статья опубликована на iXBT.com