Двухпроходное сжатие в DivX с переменным битрейтом
Одно из самых важных изменений в мире видео за последние несколько лет это появление DV-видеокамер. Что же такое DV и почему этот формат считается такой важной вехой индустрии?
🕛 27.10.2006, 11:31
Зачем это нужноMPEG-4 во время кодирования может использовать несколько различных алгоритмов для распределения данных в видеопотоке, наиболее часто используемый: constant bitrate (постоянный поток данных), когда вы ограничиваете битрейт в явном виде, например 900 кбит/сек. Кодек вычисляет сколько же может занимать один кадр, в нашем примере это 900 кбит/25 кадров=36кбит=4.5 килобайта. Каждый кадр анализируется и записывается ровно столько деталей чтобы вписаться в указанные 4.5КБ - независимо от содержимого кадра. Если в какой-то момент в кодируемом фильме есть сцены с быстрым движением - там будет много артефактов, если же кадры практически не отличаются друг от друга, то будут закодированы даже самые мельчайшие изменения между ними (а это обычно шумы). Но зато вы заранее можете знать сколько займет скажем полуторачасовой фильм после кодирования.
Второй вариант - constant quality, вы задаете число в процентах, насколько может отличаться сжатый кадр от оригинала. Постоянно отбрасывая мельчайшие детали кодек останавливается при достижении такого качества и записывает их в поток не обращая внимания на коэффициент сжатия. В результате все сцены - и динамичные и с малым количеством движения выглядят одинаково (хорошо или плохо - зависит от коэффициента). Подвох в том что предугадать размер файла заранее невозможно и потребуются несколько дней чтобы методом проб и ошибок подобрать коэффициент так чтобы фильм влез на 1 CD. Кроме того, в определенные моменты времени поток данных может возрастать настолько, что при воспроизведении с ним не будут справляться CD-ROM, винчестер или процессор - в результате выпадение кадров.
И вот начиная с версии DivX 4.0 появляется переменный битрейт. Кратко это можно описать так: для динамичных сцен выбирается бОльший битрейт, для статичных меньший, общий же, средний битрейт задается пользователем. Чтобы кодек мог распределять свободный битрейт и знал какой кадр сжимать с каким коэффициентом чтобы общий битрейт получился равным заданному приходится идти на жертвы. Введено понятие нескольких проходов - на первом происходит анализ каждого кадра и распределение коэффициентов, на втором собственно кодирование. Промежуточные данные, которые собираются при первом проходе записываются в некий посторонний файл, а полученный AVI не содержит видео вообще.
Как это сделать? на примере VirtualDub
Большинство программ, в том числе излюбленный нами для целей перекодирования VirtualDub не имеют специальной функциональности для двухпроходного кодирования, но тем не менее использовать этот алгоритм можно и нужно! В этом поможет способность VirtualDub работать по заранее подготовленному списку задач.
Откройте исходный видео-файл (File -> Open Video File...)
Примените необходимые фильтры, установите точки начало и конца, и выполните другие тонкие настройки программы если это необходимо. Мы не станем объяснять как это сделать, так как это выходит за рамки этой статьи и не относится непосредственно к двухпроходному кодированию. Подразумеваем, что вы знакомы с программой.
Выберите Video -> Full Processing Mode
Выберите Audio -> No Audio. Да, да, да! Мы не оговорились. Во время первого прохода мы можем полностью отключить работу с аудио, это значительно ускорит обработку.
Video -> Compression. Выберите кодек DivX и нажмите кнопку Configure. Для первого прохода выберите "Multipass, 1st path" (в различных версиях кодека пункт может называться по разному, но смысл такой же - первый проход). Введите желаемый средний битрейт и настройте другие параметры при необходимости. Менять их во втором проходе будет нельзя (за редким исключением).
File -> Save as AVI. Сохраните ваш файл, скажем под именем result.avi. Начнется первый проход. Ждите пока он завершится.
В результате будет создан файл абсолютно непригодный для воспроизведения - в нем нет ни видео ни звука, но вся нужная работа была выполнена, во время кодирования в корень диска C: кодек записывает два вспомогательных файла - карты распределения видеоданных, именно они будут использоваться во втором проходе.
второй проход
Файл с исходным видео остался открытым в VirtualDub, также сохранились все настройки от первого прохода, поэтому вам не нужно настраивать ничего заново.
Выберите Audio -> Full Processing Mode, а также установите нужные параметры сжатия звука (кодек, возможно фильтры, ресемплинг - то что нужно именно вам). Просто не забудьте что аудио обрабатывается именно на этом проходе.
Video -> Compression. У вас выбран кодек DivX, нажмите Configure. Вместо "1st path" выберите "второй проход" (он может называться также N-ный проход, зависит от версии кодека).
File -> Save as AVI. Сохраните файл с именем result.avi. Да, сейчас мы тоже не ошиблись, это файл созданный при первом проходе, перезаписывайте этот файл без страха, он вам не нужен. Началось кодирование. Дождитесь результата.
Полученный файл result.avi готов к использованию.
На последок парочка полезных советов для оптимизации процесса.
Мы вам уже сказали что во время первого прохода лучше полностью отключить обработку аудио, это действительно сохранит вам время и место на диске.
На время первого прохода можно также отключить некоторые фильтры, особенно если они потребляют много вычислительных ресурсов (например удаление шумов) и не меняют картинку коренным образом, не добавляют ничего в кадр, не меняют размер и т.д. Помните, для чего нужен первых проход - чтобы кодек смог определить какие кадры кодировать с большим а какие с меньшим битрейтом. Кадры во время двух проходов в идеале должны совпадать, но мелкие изменения вроде нечетких или размазанных краев не решают в основном ничего.
Если у вас нет времени дожидаться окончания первого прохода, чтобы запустить второй, вы можете воспользоваться таким удобством VirtualDub как пакетная обработка. В пунктах 6 и 11 отметьте галочку "Don't run this job now; add it to job control so I can run it in batch mode". И затем после пункта 11 выберите File -> Job Control и нажмите в появившемся окно кнопку "Start".
Внимание! между двумя проходами кодирования одного проекта нельзя выполнять обработку другого файла! При этом могут быть повреждены те самые вспомогательные файлы, созданные кодеком! Особенно внимательны будьте при пакетной обработке!