Оцифровываем видео при помощи ТВ тюнера

VirtualDub: секреты профессионалов


В этом разделе будет описано несколько необычных методов работы с программами VirtualDub и VirtualDubMod, которые требуют базовых навыков по работе с программой и определённого уровня знаний в области обработки видео. Насколько мне известно, эти методы не были ранее описаны в каких–либо статьях. Информация о них взята из документации к программам, собрана из разрозненных писем в конференциях и форумах, некоторые идеи принадлежат лично мне.

Список заданий: дополнительные возможности

В разделе «Запуск обработки видео» были описаны базовые возможности списка заданий программы VirtualDub: задания можно сразу запускать на выполнение, а можно добавить в список заданий. Управлять списком заданий вы можете в окне File — Job control. Задания в списке можно откладывать (Postpone) или переводить в режим ожидания выполнения (Waiting). Кнопкой Strart вы запускаете процесс выполнения заданий: они будут выполнены по очереди, одно за другим. После успешного выполнения задание помечается как Done, прерванные пользователем задания обозначаются Aborted, в случае возникновения какой–либо ошибки во время выполнения используется пометка Error

(двойным щелчком мыши по строке с таким заданием вы вызовете окно с подробной информацией о произошедшей проблеме).

Главное удобство списка заданий в том, что он автоматически сохраняется в файл VirtualDubMod.jobs в каталоге с программой VirtualDubMod — это значит, что список заданий будет сохранён, даже если закрыть программу и запустить её заново. Иногда полезна возможность сохранения текущего списка заданий в указанный пользователем файл: позже список заданий можно загрузить из такого файла. В меню Options окна Job control можно включить режим, при котором VirtualDubMod автоматически выключит компьютер после выполнения всех заданий (Shutdown when finished).

jobs файл

Если открыть сгенерированный VirtualDubMod’ом jobs файл в текстовом редакторе, то легко увидеть, что это сценарий (похожий на сценарий редактора AviSynth). В документации к программе VirtualDubMod приведено описание команд языка сценариев, описаны параметры команд. В определённом смысле формат команд сценариев сам себя описывает: немного поэкспериментировав с программой, несложно понять что к чему. Попробуйте создать несколько различных заданий по обработке видео, сохраните их в списке заданий и проанализируйте созданный программой сценарий в файле VirtualDubMod.jobs


Типичный сценарий выглядит так:



VirtualDub.Open("С:\\File.avi","",0);





открыть файл С:\File.avi (символ «\» — обратная дробь — дублируется, как это принято в синтаксисе языка C)



VirtualDub.RemoveInputStreams();



сбросить установки



VirtualDub.video.SetDepth(24,24);



глубина цвета при обработке: 24 бита



VirtualDub.video.SetMode(3);



режим: Video — Full processing mode



VirtualDub.video.SetFrameRate(40000,1);



частота кадров (25 кадр/сек = 40 мс/кадр = 40 000 мкс/кадр )



VirtualDub.video.SetCompression(0x78766964,0,10000,0);



использовать сжатие видео: тут используются 16–ричные коды форматов сжатия видео, соответствие кодов и форматов несложно определить экспериментально



VirtualDub.video.SetCompData(370,"OAEAAA…");



настроить параметры кодека видео: параметры кодека сохраняются в закодированном виде (как набор букв)



VirtualDub.video.filters.Clear();



очистить набор фильтров



VirtualDub.video.filters.Add("rmPal");



добавить фильтр rmPal



VirtualDub.video.filters.Add("null transform");



добавить фильтр Null Transform



VirtualDub.video.filters.instance[1].SetClipping(4,4,6,8);



настроить обрезку краёв для 2–го фильтра — Null Transform (фильтры нумеруются с нуля)



VirtualDub.video.filters.Add("dynamic noise reduction 2.1");



добавить фильтр Dynamic Noise Reduction 2.1



VirtualDub.video.filters.instance[2].Config(12);



настроить фильтр DNR: параметр равен 12



VirtualDub.subset.Clear();



сбросить настройки выделения



VirtualDub.subset.AddRange(0,182879);



обработать диапазон кадров от 0 до 182 879



VirtualDub.SaveAVI("C:\\File-done.avi");



сохранить полученный в результате обработки файл в C:\File-done.avi



VirtualDub.Close();



закрыть файл после обработки

Для простоты в приведённом выше сценарии были опущены команды по работе со звуковыми дорожками: обрабатывается только видео.



Как видно из примера, команды сценария достаточно просты и понятны. Нужно лишь разобраться в деталях: в каком порядке в команде обрезки краёв перечислены значения и т. п. Если нужно исключить из обработки какой–либо фрагмент файла, то командами AddRange надо добавлять только включаемые в обработку фрагменты (нумерация кадров ведётся по исходному файлу, начиная с нуля). Из–за того, что параметры кодека видео сохраняются в виде закодированного блока данных (как набор букв), их можно лишь копировать из сценария в сценарий. Это неудобно: в этом блоке закодированы значение ширины потока данных (bitrate), имя файла анализа видеоряда (log file) и все прочие параметры. С другой стороны, такой подход более универсален, т.к. позволяет использовать любой формат сжатия видео.

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

Как приостановить обработку видео и продолжить её после?

В силу особенностей архитектуры обработки видео, невозможно приостановить обработку видео и продолжить её после: в VirtualDub нет и не будет команд «пауза» и «продолжить». В некоторой степени это компенсируется тем, что VirtualDub позволяет во время работы изменять приоритет процесса обработки видео: если приостановить обработку видео нужно для выполнения на компьютере других задач, достаточно изменить приоритет VirtualDub на Idle.

Если необходимо выключить компьютер, то можно воспользоваться Спящим режимом системы Windows (Hibernate): питание компьютера в таком режиме может быть отключено, а при повторном включении компьютера будет полностью восстановлен предыдущий сеанс работы с Windows, включая все запущенные программы.

В следующем разделе описан ещё один способ, который позволит разбить сеанс обработки видео на несколько частей.

Сегментированные файлы

VirtualDubMod содержит замечательную возможность разделять полученное в результате обработки видео на сегменты, которые сохраняются в виде набора файлов с последовательными номерами. Во–первых, это позволит обходить ограничение на размер файла в файловой системе FAT32 (4 Гбайта). Во–вторых, таким нехитрым способом можно разделить процесс обработки видео на несколько этапов: это полезно, если понадобится прервать процесс обработки видео или если процесс аварийно прервётся в результате зависания программы (компьютера). В случае, когда файл с обработанным видео разбивается на сегменты, обработку видео не придётся начинать с самого начала: готовые сегменты сохранены в нескольких файлах, их можно просматривать или подвергать дальнейшей обработке.





VirtualDubMod позволяет автоматически открывать набор сегментов видео (параметр Automatically load linked segments в окне File — Open video file): достаточно открыть первый файл, остальные сегменты загружаются автоматически.

Для того, чтобы продолжить обрабатывать файл нужно:

1.                 если процесс обработки видео был прерван аварийно, нужно удалить последний сегмент видео: в этом файле отсутствует блок index, описывающий содержимое файла (потому этот файл непригоден для воспроизведения и дальнейшей обработки)

2.                 открыть все обработанные сегменты: File — Open video file, включить параметр Automatically load linked segments, выбрать файл с первым сегментом видео

3.                 запомнить количество кадров, которые уже были обработаны: Edit — End, Edit — Go to, в этом окне вы увидите номер последнего кадра (назовём это число n)

4.                 закрыть обработанную часть видео (File — Close video file), создать на диске подкаталог (папку) и переместить туда готовые сегменты видео

5.                 заново открыть исходный файл и в точности восстановить параметры обработки видео (File — Load processing setting)

6.                 исключить из обработки первые n кадров: Edit — Go to — Jump to frame number:

n, Edit — Set selection end, Edit — Beginning, Edit — Set selection start, Edit — Delete

7.                 запустить на выполнение (сразу же или через список заданий) обработку оставшейся части видео: File — Save As



8.                 переименовать полученные сегменты так, чтобы их номера продолжали нумерацию ранее обработанных сегментов

9.                 переместить переименованные сегменты в подкаталог к ранее обработанным сегментам

10.             теперь можно открыть полностью обработанный файл: File — Open video file, включить параметр Automatically load linked segments, выбрать файл с первым сегментом видео

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

Недостаток метода: он годится только для однопроходного сжатия. При первом проходе двухпроходного сжатия создаётся пустой видеоряд — данный метод не подойдёт: сегментирование файла анализа видеоряда (log file) не поддерживается. На втором проходе двухпроходного сжатия использовать этот метод также не рекомендуется: для того, чтобы перераспределение битов производилось по всей длине видеозаписи, необходимо второй проход сжатия производить для всего видеоряда целиком. Попытки использовать такой метод для второго прохода приведут к получению файла неверного размера и к ухудшению качества сжатого видео.

Значение этого недостатка не столь велико, как кажется с первого взгляда: обработка видео, которая занимает много времени (может длиться десятки часов), обычно выполняется в однопроходном режиме. Финальное сжатие видео, которое выполняется в два прохода, занимает всего несколько часов.

Как сэкономить на промежуточном сжатии

Традиционно используются два способа обработки видео. Первый способ: видеозапись обрабатывается набором фильтров, полученный результат сохраняется в файл. Обработка фильтрами требует значительных вычислительных ресурсов и занимает много времени. На этом этапе используется промежуточное сжатие (HuffYUV или MJPEG): такой файл достаточно велик, по размеру он часто равен исходному файлу с оцифрованным видео. Полученный файл с обработанным видео подвергается редактированию и монтажу, а в конце — финальному сжатию в формат MPEG в два прохода. Сжатие производится сравнительно быстро.



Второй способ можно использовать, когда вам не нужно редактировать обработанное видео. Исходное оцифрованное видео подвергается сжатию в формат MPEG в два прохода. Поскольку при обоих проходах должен использоваться один и тот же исходный видеоряд, то при каждом проходе необходимо производить одинаковую обработку видео. Оба прохода требуют значительных вычислительных ресурсов и занимают много времени.

Есть ещё третий способ, который вы можете применять вместо второго: когда вам не нужно редактировать обработанное видео. Он описан в Официальном руководстве по DivX 5.2. Вместо промежуточной обработки видео и первого прохода нужно использовать режим 1–pass quality based с включённой записью файла с анализом видеоряда (write log file) — именно он создаётся при первом проходе двухпроходного сжатия. При этом рекомендуется использовать максимальное качество видео: 1. Размер этого файла будет примерно в 5—10 раз меньше того же видео, сжатого HuffYUV или MJPEG. На втором проходе используйте полученную на первом проходе видеозапись в формате DivX (без каких–либо фильтров и правок: файл содержит уже обработанное видео) и полученный файл с анализом видеоряда (log file). Кодер XviD также способен на такой фокус: выполните первый проход в режиме Two pass — 1st pass, при этом в дополнительных настройках (more) включите Full quality first pass и выключите Discard first pass. Подробнее финальное сжатие видео описано в разделе VirtualDub: финальное сжатие видео.



Используя этот график, вы можете сравнить различные способы обработки видео. Цифры приведены приблизительно соответствующие реальным: размер исходной оцифрованной видеозаписи и размер обработанной записи в формате HuffYUV равны 50 ГБайт, размер обработанного видео в формате DivX — 6 ГБайт, размер готового видео — 1,5 Гбайт (2 CD). Время обработки видео комплектом фильтров — 20 часов, время одного прохода сжатия в DivX — 2 часа. (Щёлкнув на трёхмерную диаграмму, вы можете увидеть эквивалентную плоскую диаграмму.)



Может показаться, что в таком варианте будут допущены потери качества изображения: в качестве промежуточного формата используется сжатие с потерями MPEG–4. Однако это не так: при сжатии в DivX с максимальным качеством (минимально возможный коэффициент квантования 1) будут выполнено только лишь квантование изображения (разделение изображения на квадратные блоки). Все остальные блоки кодера DivX, которые уменьшают размер видео и ухудшают качество изображения (применение кривой сжатия и увеличение коэффициента квантования и т.д.) в этом режиме не работают. При выполнении второго прохода сжатия, алгоритм MPEG–4 в первую очередь разобьет изображение на блоки, выполнит квантование. Но именно в таком виде оно и записано в сжатом файле! (Происходящее несколько упрощено, но в целом соответствует действительности.) Устройство всех трёх способов обработки видео схематически приведено ниже:



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

Как добавить в список заданий оба прохода сжатия видео

Из–за того, что на втором проходе в качестве исходного используется файл, который будет создан в результате выполнения первого прохода, штатными средствами не удастся добавить в список заданий задания для выполнения обеих проходов. В этой ситуации сработает маленькая хитрость.

Запустите первый проход на выполнение, выключив режим Don’t run this job now… После того, как несколько кадров будет обработано, отмените выполнение первого прохода (Abort). При этом будет создан файл, который будет использоваться как исходный для второго прохода. Ничего не меняя в настройках, нужно сохранить задание для первого прохода: File — Save As, режим Don’t run this job now…

надо включить. Запомните количество кадров, которое содержит обрабатываемый видеоряд: Edit — End, Edit — Go to, в этом окне вы увидите номер последнего кадра (назовём это число n). Далее нужно открыть файл, полученный в результате прерванного первого прохода, настроить задание для второго прохода и сохранить его в списке заданий. Закройте VirtualDubMod, оба задания будут сохранены в файле VirtualDubMod.jobs в каталоге программы. Откройте этот файл в текстовом редакторе, найдите сценарий для выполнения задания для второго прохода (последнее задание). В команде VirtualDub.subset.AddRange второй параметр нужно поменять на число n. Сохраните файл. Теперь вы можете запустить VirtualDubMod  и выполнить оба прохода: File — Job control — Start.



Распределённая обработка видео

Предыдущая ветка развития программы VirtualDubMod (1.4.13) содержала функцию распределённой обработки видео: несколько компьютеров объединяется в вычислительный кластер, один из компьютеров назначается ведущим (master) — он следит за выдачей заданий всем компьютерам кластера — остальные компьютеры становятся ведомыми (slave). Идея проста: ведущий компьютер делит файл на части и раздаёт нескольким ведомым компьютерам задания на обработку фрагментов. Несколько компьютеров, работая параллельно, выполнят задачу быстрее одного компьютера. После того, как все фрагменты будут обработаны, ведущий компьютер «склеивает» их в один файл. Кластер управляется с ведущего компьютера, отсюда же можно наблюдать за работой всех компьютеров.



Ниже описана настройка кластера на базе VirtualDubMod 1.4.13.2v2 (это последняя версия из ветки 1.4.13, её можно скачать с сайта программы). В файле справки к программе эта функция достаточно подробно описана (на английском языке), точнее там описано, как эта функция должна

работать. Программа содержит уйму ошибок: по этой причине функция распределённой обработки не была включена в новую ветку программы — 1.5. Например, мне так и не удалось заставить работать параметр командной строки ‘/j’, который должен при запуске автоматически переводить VirtualDubMod в ведомый режим.

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



Установка программ

На каждом из компьютеров должен быть установлен VirtualDubMod с комплектом используемых фильтров и кодеков, причём нужно использовать одинаковые версии всех компонентов. Учтите, что запустить VirtualDubMod из одного сетевого каталога с общим доступом не получится: вероятно, он хранит какую–то информацию о запущенной сессии в файлах конфигурации. Кодеки можно использовать любые: я пробовал DivX 5.05 (однопроходный режим с заданным потоком данных, однопроходном с заданным уровнем качества), HuffYUV 2.1.1 и PICvideo MJPEG. Не забудьте зарегистрировать кодек PICvideo MJPEG на каждом компьютере! В противном случае в части фрагментов вы получите бегущую строку с рекламой.

Использование большого количества компьютеров предъявляет повышенные требования к стабильности работы программ и фильтров. Во время своих экспериментов я использовал бета–версию фильтра QS Deinterlace 0.52b: на моём компьютере он отлично работал. При распределённой обработке от него пришлось отказаться, так как он вызывал зависания VirtualDubMod’а на трёх компьютерах. Если используется версия фильтра, оптимизированная под набор команд какого–либо процессора, нужно убедиться, что этот набор инструкций поддерживают процессоры всех компьютеров кластера.

Настройка

Настройки процесса обработки видео выполняются на ведущем компьютере.



Длина фрагмента (Segment length): рекомендуется использовать минимальную длину в 1 мин. Это позволит более аккуратно распределять вычислительные ресурсы. Например: есть два компьютера, со скоростью 5 и 10 условных единиц. Если разделить исходное видео на 2 части, то скорость всего процесса обработки видео будет ограничена скоростью медленного компьютера. Если видео разделить на 9 частей, то быстрый компьютер выполнит обработку вдвое большего количества частей, потому к результату мы придём быстрее. Максимальное количество частей, на которые может быть разделена видеозапись — 512. Даже если использовать фрагменты диной в минуту, это создаёт ограничение на длину обрабатываемого видео в более чем 8,5 часов (на практике видеозаписи такой длины не встречаются).



Приоритет (Process priority). Эта настройка определяет приоритет процесса кодирования, её можно изменить независимо на каждом компьютере. Рекомендуется на всех компьютерах выставить Idle: в этом режиме все программы на компьютере будут иметь приоритет над кодированием видео, что позволит нормально работать за любым их компьютеров кластера. На кодирование видео будет расходоваться процессорное время, оставшееся после выполнения остальных задач (обычно в это время процессор ничего не делает).

Всегда перезапускать задания (Always restart jobs) — будет ли кластер продолжать задание, в случае если его остановить и запустить заново; или же начнёт обрабатывать видео заново. Мне не удалось заставить кластер продолжить обработку остановленного задания, потому следует включить этот параметр.

Обработку звука (Process Audio) — рекомендуется выключать. Поскольку она происходит во много раз быстрее, чем обработка видео, гораздо проще выполнить обработку звука на одном компьютере. Потом звук несложно присоединить к обработанному видео. Если вы хотите, чтобы кластер обрабатывал звук, учтите: с синхронизацией звука возникают некоторые проблемы. Подробности описаны в документации.

Send slave to tray — при минимизации VirtualDubMod на ведомом компьютере, соответствующая кнопка будет убрана из Панели задач, взамен появится значок (icon) в Области уведомлений (system tray). Это удобно для тех пользователей, которые работают за ведомыми компьютерами: в Панели задач нет «лишних» программ: только те, которые запустил пользователь.

Выключать ведомые компьютеры по завершении (Shutdown clients when finished) — после окончания процесса обработки ведущий компьютер выключит все ведомые компьютеры. Параметр Выключать по завершении (Shutdown when finished) также позволяет выключить ведущий компьютер после окончания процесса обработки видео.

Исходное и обработанное видео

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



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

Фрагменты после склеивания будут удалены, но именно на момент склеивания нужно много места на диске. Для того чтобы обойти эту проблему, я написал специальную программу: см. раздел «Жёсткий диск enlargement». В качестве альтернативы можно сохранять результат обработки видео в некий каталог C:\Dir\ — надо, чтобы такой каталог существовал на каждом компьютере, и там было достаточно места (надо вместить все фрагменты, обрабатываемые этим компьютером). На ведущем компьютере в этом каталоге должен также поместиться склеенный файл результата. Также надо проверить наличие прав на запись в этот каталог у всех участников процесса.

Запуск обработки

На ведущем компьютере нужно создать задание по обработке видео: всё делается как обычно, за исключением путей к файлам (см. выше). В окне Save AVI включаем Put in job list. Таким образом, можно создать несколько заданий. Далее в окне Job control нужно нажать Update (будет выведен список компьютеров в сети), Master

(компьютер будет назначен ведущим) и Start (начать обработку заданий). Ведущий компьютер сразу выделит себе фрагмент видеозаписи и начнёт его обработку. Из–за необходимости контролировать кластер, производительность ведущего компьютера снижается на 5–10%. По мере обнаружения ведомых компьютеров, им также будут выделены фрагменты видеоряда и переданы задания на обработку.



На ведомом компьютере нужно только лишь запустить VirtualDubMod, в окне Job control нажать Update

(будет выведен список компьютеров в сети) и Slave (назначить компьютер ведомым). Ведомый компьютер будет ждать получения задания на обработку фрагмента видео от ведущего компьютера, а когда такое задание будет получено — начнётся его выполнение. Случается, что ведомый компьютер не распознаётся ведущим, тогда попробуйте перезапустить программу на ведомом компьютере. Эти проблемы возникают достаточно спонтанно и бессистемно: я так и не понял, как с ними эффективно бороться.



За процессом обработки видео кластером можно очень наглядно наблюдать с ведущего компьютера: в окне Job control индикатор прогресса отображает границы фрагментов, разными цветами выделены уже обработанные фрагменты видео, обрабатываемые в данный момент каким–то из компьютеров и ожидающие своей очереди. В списке перечислены все компьютеры сегмента, среди них указаны участвующие в процессе обработки видео. Для каждого из компьютеров кластера отображается средняя скорость обработки видео, начало и конец фрагмента видеоряда. Любой из ведомых компьютеров можно исключить из процесса обработки видео кнопкой Abort.

Предупреждаю ещё об одной ошибке программы: при создании задания нельзя выделять фрагмент для обработки, иначе программа будет генерировать пустые файлы. Вместо этого выделите и удалите (Edit — Delete) ненужные фрагменты — перед необходимым фрагментом и после него.

Надёжность распределённой обработки

В случае остановки одного из ведомых компьютеров — по причине остановки пользователем с ведущего или ведомого компьютера, или же в результате аварийного завершения из–за зависания программы или компьютера — ведущий компьютер направит «недоделанный» фрагмент другому компьютеру. Зависший ведомый компьютер можно заново включить, настроить и подключить к процессу обработки: он получит новое задание. На надёжность распределённой обработки видео влияет только надёжность  ведущего компьютера и сетевых папок с общим доступом, из которых все компьютеры считывают исходное видео и куда записывают результат обработки.



В моих экспериментах программы запускались на ОС Windows XP, XP SP1, 2000 SP2. Попытка использовать ведомый компьютер под управлением Windows 98 SE привела к тому, что VirtualDubMod на ведомом и ведущем компьютерах вошли в состояние «Не отвечает на системные запросы» (Not respondning). Надо отдать должное, после отключения  ведомого компьютера под Windows 98, процесс обработки видео продолжился.

Загрузка сети

Программа содержит массу ограничений на использование сети: все компьютеры должны находиться в пределах одного сегмента сети, в одном сегменте может быть запущена только одна распределённая задача (только один ведущий компьютер). Также программа ведёт себя нестабильно при большом количестве компьютеров: так, в корпоративной сети большого предприятия с 200 компьютерами в одном сегменте, программа зависала прежде, чем выдавала список компьютеров в сегменте сети. В небольшой же офисной сети с 10–15 компьютерами такой проблемы никогда не было.

В моих экспериментах исходным был файл (PicVideo MJPEG @ 19, 768x576) с битрейтом примерно 25 Мбит/с. Все 8 компьютеров считывали его из одного каталога с общим доступом. Загрузка 100 Мбит сетевого интерфейса составляла примерно 20% пропускной способности. Результат (HuffYUV, 384x288) записывался на другой компьютер: там создавался примерно такой же поток данных и примерно такая же загрузка сетевого интерфейса.

При попытке держать исходное видео и файл результата на одном компьютере наблюдалась весьма неприятная картина: сетевая карта Realtek 8139 так загрузила процессор, что за компьютером было невозможно работать, даже мышь двигалась рывками. Если вы планируете использовать распределённую обработку видео, подумайте о покупке хорошего сетевого оборудования (Intel, 3COM — такие сетевые карты не занимают процессор своими задачами). Возможно, имеет смысл задуматься о сети с гигабитной пропускной способностью, ведь в моём случае передавались не очень большие потоки информации: во–первых, разрешение обработанного видео невелико, во–вторых, скорость обработки видео не очень высока (примерно 1 кадр/сек. на каждый 1 ГГц процессора).



Что это даёт?

Результат моих экспериментов: обработка видео одним компьютером (Intel Celeron 1100A @ 1,47 ГГц) занимает 20 часов; кластер из 8 компьютеров от 866 МГц до 2,4 ГГц справился с задачей за 4 часа. Во время обработки видео все сотрудники работали за своими компьютерами как обычно. «Эффективная скорость» кластера составила примерно 7,5 ГГц — ни один современный процессор не в состоянии обеспечить такой скорости работы. Один из компьютеров во время выполнения задачи пришлось выключить — на качестве результата это никак не сказалось.

Жёсткий диск enlargement

Мне очень не понравилось то, что на жёстком диске нужно вдвое больше места, чем размер результирующего файла: зачем платить за жёсткий диск в 120 Гбайт, если на него можно сохранить файл размером не более 60 Гбайт? Чтобы выйти из этого положения, я написал специальную программу.

Идея проста: не нужно склеивать фрагменты видео в один файл, ведь их запросто можно последовательно открыть в VirtualDubMod’е при помощи функции Добавить фрагмент (File — Append AVI segment) и обрабатывать так же, как один склеенный файл. Первое препятствие на пути к желаемой цели: количество фрагментов. Открыть 60 файлов — это значит 60 раз выполнить операцию File — Append AVI segment. Во–первых, это неудобно и утомительно. Во–вторых, положение осложняется тем, что порядок фрагментов видео не соответствует порядку их нумерации. Программа выдаёт фрагментам номера в соответствии с порядком их обработки, а этот порядок не соответствует последовательности фрагментов в видеозаписи.

VirtualDubMod записывает подробности о распределённой обработке видео в файл с расширением parts, имя его совпадает с именем сохраняемого AVI файла. Моя программа — VDMCH

(VirtualDubMod 1.4.13 Cluster compression Helper) — анализирует файл parts и создаёт файл с расширением jobs.part, его содержимое нужно вставить в сценарий VirtualDubMod вместо команды Open. В этом файле записан набор команд: Open и множество Append с нужными именами фрагментов в нужном порядке. Это позволит составить финальный видеоряд из фрагментов в нужном порядке, в готовом для дальнейшей обработки в VirtualDubMod виде.



Сценарий распределённой обработки видео с использованием моей программы получается таким:

1.                 Настроить задание по обработке видео и запустить его на обработку кластером компьютеров, пусть обработанное видео сохраняется в файл с именем FileName.avi

2.                 После того, как обработка будет выполнена, ведущий компьютер приступит к «склеиванию» фрагментов в один файл: работу программы можно прервать (Abort). Обработка видеоряда к этому моменту уже закончена.

3.                 Скопируйте программу VDMCH.exe в каталог, куда сохранялось обработанное видео. Запустите программу командой ‘VDMCH FileName’ — программа создаст файл с именем FileName.jobs.part

4.                 Для дальнейшей обработки видео вы можете использовать VirtualDubMod версии 1.5. Запустите VirtualDubMod, в котором вы хотите продолжить обработку полученного видео. Откройте в нём один из фрагментов обработанного видео, настройте задание по дальнейшей обработке видео и сохраните его в списке заданий. Можно создать несколько заданий, например несколько проходов двухпроходного сжатия. Закройте VirtualDubMod.

5.                 Откройте файл сценария VirtualDubMod.jobs, принадлежащий соответствующему VirtualDubMod, в текстовом редакторе. Отыщите только что созданные задачи по дальнейшей обработке видео. Для всех этих задач строку с командой Open необходимо заменить на содержимое файла FileName.jobs.part: он содержит команду Open и ряд команд Append. Сохраните файл сценария.

6.                 К этому моменту все фрагменты обработанного видео должны находиться в одном каталоге. Запустите VirtualDubMod, в котором вы хотите продолжить обработку полученного видео. Чтобы начать выполнение заданий нажмите кнопку Start в окне File — Job control.

Учтите, что формат файла сценария в VirtualDub версий 1.4 и 1.5 несколько различается. Команды Open и Append имеют одинаковый формат, потому файл, сгенерированный программой VDMCH, можно использовать для редактирования сценариев VirtualDubMod версий 1.4 и 1.5.


Содержание раздела