В любительской практике нередко возникает потребность перекодировать видеофайлы. И если для профессионала размер файла не играет особой роли, то для начинающего «режиссера» он зачастую приобретает решающее значение. Также задача минимизации файлов возникает при размещении их в Интернете. Сейчас оптимальное соотношение между качеством изображения и размером видеофайла обеспечивают, пожалуй, кодеки семейства MPEG-4 (DivX и Xvid). Оптимальный результат при уменьшении объема файла дает кодирование с переменной скоростью потока данных (bitrate), которая выбирается автоматически так, чтобы получилось наилучшее качество текущего фрагмента. В динамичных сценах локальное значение скорости потока данных будет увеличиваться, а в статичных — уменьшаться.

Но заранее спрогнозировать, каким окажется объем файла, сжатого с переменной скоростью потока данных, невозможно. Значит, для того чтобы подогнать его размер под емкость «болванки» (CD-R) или под имеющееся на веб-сервере место, приходится прибегать к двухпроходному кодированию. Во время первого прохода анализируется файл, вычисляются коэффициенты для его фрагментов, а во время второго текущая степень сжатия «подстраивается» под требуемый размер файла с учетом собранных статистических данных.

Рассмотрим, как выполнить данные операции, пользуясь только бесплатным ПО (вы ведь помните, что мы подбираем вариант для любителей?). В качестве основной рабочей программы будем использовать VirtualDub¹ (www.virtualdub.org), а в качестве кодека — DivX² (www.divx.com) пятой версии. Вообще-то двухпроходное кодирование поддерживается кодеком DivX, начиная с четвертой версии, но в пятой добавлены свойства, позволяющие несколько повысить коэффициент сжатия, сохранив качество изображения. Кроме того, в нем появилась поддержка уникальных особенностей процессоров AMD, так что обладатели Athlon сэкономят немало времени³. Учтите, что не следует применять кодеки версий 5.0.0 и 5.0.1, поскольку в них содержится ошибка распределения памяти, порой приводящая к негативным последствиям при длительной работе.

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

I = 140 • W/t,
где I - скорость потока данных, кбит/с;
W - требуемый объем файла, Мбайт;
t - длительность видеоматериала, мин.

Наличие численного коэффициента в формуле обусловлено тем, что переводятся байты в биты, минуты — в секунды, а также тем, что объем файла принято измерять в двоичных единицах (1 Кбайт — 1024 байта), а скорость передачи — в десятичных (1 кбит/с — 1000 бит/с).

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

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

Если формат исходного файла отличается от «родного» для VirtualDub семейства MPEG-4, в частности, имеется файл Video CD/MPEG-1, то отказ от перекодировки аудиосоставляющей, скорее всего, приведет к тому, что аудио в выходном файле запишется без сжатия и займет более половины объема файла. В этом случае к звуку необходимо применить сжатие. Если же файл записан в формате, совместимом с MPEG-4, но VirtualDub «не понимает» использованного формата сжатия, например в случае пятиканального звука, то, пожалуй, проще всего оставить аудио без изменения. В качестве альтернативы можно порекомендовать лишь «вырезать» звук из видеофайла и записать его в отдельный файл, который можно будет перекодировать какими-либо дополнительными программами, после чего «вставить» его обратно в видеофайл. В остальных случаях перекодировка звука вам понадобится тогда, когда вы задумали сократить объем файла и за счет уменьшения скорости потока аудиоданных.

Таким образом, если вы решили перекодировать звук или знаете скорость аудиопотока, то скорость потока видеоданных вычисляется как разность между числом, полученным по приведенной формуле, и скоростью аудиопотока. Если же последняя вам не известна, то определите ее с помощью программы VirtualDub. Загрузите нужный видеофайл и выберите File?File Information?Audio stream: Data rate. Однако бывает, что скорость потока звуковых данных по тем или иным причинам выяснить все же не удается. Тогда имеет смысл использовать другой метод, чтобы узнать объем файла, приходящегося только на аудиосоставляющую, применив опцию File?Save WAV. Объем созданного файла надо вычесть из размера желаемого, а полученную разницу подставить в приведенную выше формулу. В результате мы получим искомую скорость видеопотока (рис. 1).

рис. 1
рис. 2

Итак, у нас есть все необходимое для работы. Считаем, что мы уже запустили VirtualDub и открыли нужный файл. Для первого (предварительного) прохода из соображений экономии отключаем вывод аудиоданных (рис. 2).

Затем проверяем, установлен ли для видеоданных режим Full processing mode, и выбираем видеокодек: Video?Compression... (рис. 3).

Конфигурируем кодек (Configure), установив первый проход многопроходного режима — Bitrate: Variable bitrate mode: Multipass, 1st pass и величину скорости потока аудиоданных, вычисленную ранее по формуле (рис. 4).

рис. 3
рис. 4

После закрытия окон настройки вызываем команду: File?Save as AVI... Затем приводим название файла и указываем, что работу следует выполнять в пакетном режиме. Для этого включаем опцию в нижнем левом углу окна сохранения и нажимаем «Сохранить». Все, задание для первого прохода мы подготовили (рис. 5).

рис. 5

Теперь займемся вторым (окончательным) проходом. Прежде всего восстановим сохранение звука в выходном файле, включив функцию напротив пункта Audio?Source audio. Если же мы вычленяли аудиофайл и обрабатывали его отдельно, то вместо этого следует выбрать Audio? WAV audio.

Дальнейшие действия зависят от того, что мы собираемся делать: перекодировать аудиосоставляющую или перенести ее из имеющегося файла без изменений. В первом случае активируем в настройках Audio функцию Full processing mode, а во втором — Direct stream copy. Если перекодировка включена, то должна быть доступна настройка сжатия: Compression... Выбираем кодек (лучше всего применить MPEG Layer-3) и устанавливаем нужную скорость потока данных звука (рис. 6).

рис. 6

В случае, когда требуемого формата не оказывается, для преобразования частоты дискретизации допускается использовать опцию Audio?Conversion, а затем все-таки придется вернуться к выбору параметров сжатия. Следует помнить, что передискретизация неизбежно ведет к снижению качества звукового сопровождения, поэтому для уменьшения объема файла переход, скажем, с частоты оцифровки 48 на 22 кГц можно считать оправданным, а с 48 до 44 кГц — нет (рис. 7).

рис. 7

Теперь осталось только установить в настройках видеосжатия второй проход: Video?Compression...? Configure?Multipass, nth pass (рис. 8).

рис. 8

Снова открываем меню сохранения, вводим окончательное имя файла, включаем опцию выполнения в пакетном режиме и даем команду «Сохранить». Все готово к работе. Открываем меню управления заданиями, нажав или указав File?Job control... (рис. 9).

рис. 9

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


¹ Позволительно применить также FlasKMPEG.

² Можно также использовать Xvid.

³ Разработчики утверждают, что на процессорах фирмы Intel кодек также работает несколько быстрее.