FlasK MPEG. Фласка - зачем она нужна и как с ней бороться.

Статья написана по версии 0.594 и ее модификациям. Основные положения справедливы и для более поздних версий. Русские названия пунктов меню и кнопок даны по моей русификации программы. Русификация Flask (5 кб) лежит в разделе ссылок (http://mydivx.lihoman.ru)

Кто такая FlasK MPEG по наивному мнению ее автора (Alberto Vigata)?

Дословно:

1.1 What this program does?
The FlasK MPEG Encoder takes MPEG2 and MPEG1 program streams (video streams are currently not supported) and encodes them into another format, trying to achieve the maximum possible quality and trying to minimize the conversion impact providing a straightfordward aproach to the MPEG1/2 to MPEG/AVI conversion.
FlasKMPEG uses 'plugins' to support output formats making that way the program more flexible, and having a wide variety of output options.
1.2 How do you achieve High Quality Conversion? How does it work?
A common problem when converting one video format in another is that the source and destination frame sizes doesn't match. Then you have to resize the source into the destination size using some kind of video interpolation. In many cases this process is very rude and introduces a lot or artifacts and aliasing.
The FlasK MPEG plugs the MPEG2 decoder output right into its internal resizing motor and outputs that to the output plugin giving thus high quality conversions hard to achieve with other methods.
The MPEG2/MPEG1 decoder is based on the MSSG (Mpeg Software Simulation Group) work an has been seamlessly embedded into Flask MPEG.

Кто такая FlasK MPEG на самом деле?

Это одна из самых популярных (наряду с MPEG2AVI и DVD2AVI) программа, позволяющая пережимать VOB в AVI DivX. Она также позволяет открывать файлы MPEG-1 и кодировать файлы в bbMPEG (MPEG-2). Имеет ряд вкусных фич. Так, в отличие от DVD2AVI, она позволяет менять размер кадра, количество кадров в секунду и делать деинтэрлейс, обрезание кадра и ставить шторки. Позволяет записать видео и звук (АС3 или АС3->WAV) в раздельные файлы или в один AVI. В отличие от MPEG2AVI имеет достаточно удобный графический интерфейс. Последние версии программы имеют возможность открывать VOB файл прямо с DVD с одновременным вскрытием, т.е. встроен DeCSS (а значит экономится место на винте), правда у меня ее DeCSS вылетает :( В отличие от Virtual Dub она, как вы понимаете, открывает VOB файлы. Есть несколько хаков, ускоряющих ее и делающих ее статистику более наглядной. Может использовать плугинсы. В общем программа удобная, и все бы ничего, но...

Глюки.

Ну во-первых, это видимо самая медленная из возможных программ, цифрующих в ДивХ - это отмечает и сам автор, который пользуется кодом группы MSSG (Mpeg Software Simulation Group), это связано с декодированием повышенного качества и способностью изменять размер кадра с улучшенными алгоритмами. Во-вторых, она не знает РСМ WAV - пока что поддержка только для аудио потоков АС3 и MPEG в отдельный файл, и конвертация АС3 в WAV. В каких-то случаях она вылетает при попытке открыть интерактивное окно для задания размера кадра и обрезания-шторок. У кого-то в этом интерактивном окне цифры на кнопках сдвига-обрезания отображаются, у кого-то нет (в версии 0.6 этот глюк исправлен).

Один из самых важных глюков версии 0.594 (и 0.6) - любое кодирование заданного фрагмента или VOB файла она начинает со стоп-кадра - фрагмент начинается парой-тройкой кадров, потом идет одна и та же неподвижная картинка кадров 20-30 (по-моему зависит от количества кадров в секунду), затем кодирование продолжается с небольшого рывка. Естесственно звук при этом уходит примерно на 0.3-1 секунду вперед. Я не понимаю, с чем это может быть связано, эффект присутствует во всех вскрытых вариантах 0.594 (h1, h2, px3). Результат - небольшая десинхронизация аудио и звука. Ее конечно можно было бы подправить в Виртуал Дубе изменением FPS на несколько сотых-тысячных, либо вырезанием секунды стоящего видео (результирующий файл оказывает на 20-30 кадров больше, чем надо), но идентификация начала фрагмента из-за рывка после стоп-кадра затруднена, а также неизвестно точное количество добавляемых в фильм лишних кадров. Кроме того, начало-конец стоп-кадра не совпадает с КК. Хотя в общем-то сдвиг (interleave) аудио подобрать в Дубе можно. В общем-то все это неважно, если кодируется полный фильм, а начало фильма приходится на заставку или титры или черный фэйд (fade).

Ну и обычный глюк - небольшая рассинхронизация WAV и видео. Это наблюдается и в DVD2AVI и лечится только заданием нестандартного фрэйм-рэйта (frame rate), скажем 25.029 fps, в Виртуал Дубе с переписью файла без перекодирования. Об этом - позже.

Практическое применение.

У нас есть DVD, списанный со вскрытием на винт. Мы хотим сжать его в AVI DivX с уменьшением размера кадра и наложением фильтра деинтэрлейса (убрать чрезстрочные полосы), а также хотим подрезать сверху-снизу черные полосы.

Открываем файл IFO (со структурой DVD) или единичный VOB, Фласка скажет нам, сколько видео, аудиопотоков и субтитров найдено, позволит выбрать нужный поток аудио и субтитры.

Иногда при открытии VOB или диска Фласка не находит звука. Если вы уверены, что звук там все же есть :), то попробуйте увеличить буфер поиска - "Опции/Установки проекта/Разное (=Фрагмент)/Размер буфера поиска". По умолчанию его значение равно 5000 кб. Попытайтесь поставить 7000, или 10000, и снова попробуйте загрузить свой VOB файл. Файл при этом будет открываться медленнее, но пропащий звук может обнаружиться.

Если мы открываем файл IFO (в режиме "открыть DVD") и у нас DVD только с одним потоком PCM WAV, то лично у меня любые варианты Фласки просто сразу вылетают. В этом случае придется использовать пару FlasK (для видео пофайлово) + DVD2AVI (для WAV аудио) с последующим объединением в VD, либо DVD2AVI (для видео с максимальным битрэйтом, либо через VFAPI, и WAV аудио) + VirtualDub (для кодирования на средний битрэйт с ресайзом и объединения видео с аудио).

Выбор видео кодека.

Выбираем в меню Опции/Выбор формата/AVI Output. Затем выбираем в "Опции/Установки кодеров/[Select codec] Video" нужный нам вариант ДивХ и задаем там же битрэйт и количество КК (KF) в секунду (об установках кодека DivX см. предыдущие статьи). Разумеется, если вам не требуется Дивх, вы можете выбрать свой кодер.

Размер кадра, обрезание, шторки.

Теперь займемся размером кадра. Опции/Установки проекта/Видео. В нижнем ряду мы видим три кнопки, одна из которых "Размер кадра", нажмем. Получаем интерактивное окно с рядами кнопок и кадром исходного фильма. Нажмем "Восстановить", чтобы восстановить реальный размер кадра исходного фильма. Затем кнопками [+] и [-] в разделе "Выходной размер" отрегулируем ширину и высоту фильма, сверяясь с размерами в точках, показываемыми в левом верхнем углу кадра. О рекомендуемых размерах кадра см. предыдущие статьи.

Временами встречается глюк такого плана - при нажатии на "Размер фильма" Фласка вылетает с сообщением об ошибке при обращении внутри себя. Иногда это лечится при помощи выставления реального размера кадра в поле "Размер кадра", закладка "Видео". Для этого надо либо заново открыть файл (диск), дабы вернуть эти значения в исходное положение, либо прописать его ручками, посмотрев данные в меню "Запустить/Просмотр/Video Size". Дело в том, что Фласка не любит нестандартных размеров высоты-ширины (не кратных 16) и в интерактивном окне задания размеров не позволяет менять их своевольно, но в закладке "Видео" можно прописать кривой размер кадра и тогда она видимо вылетает на проверке ошибки - нет ветви алгоритма, допускающего, что установлен неправильный размер. Скорее всего это будет устранено в следующих версиях.

Здесь же мы можем задать и обрезку черных полей сверху-снизу с уменьшением реального размера кадра конечного фильма. Это даст нам небольшую экономию места на диске (черные поля конечно хорошо пакуются, но все же пакуются и занимают место) и отсутствие мелких артефактов на черных полях, которые могут появится при сжатии, особенно на малых и средних битрэйтах. Для включения обрезания кадра нужно отметить пункт "Обрезка", затем уменьшить [-] высоту (и/или ширину) кадра. Кадр подрезается всегда снизу (справа). После этого можно задать сдвиг кадра в подрезанном "окне" вверх (влево) и редактировать сдвиг вверх-вниз (вправо-влево) кнопками [+] и [-] около соответствующих надписей.

Уменьшение кадра может быть кратно только 16, а вот сдвиг может быть и на одну точку.

Шторки применяются для скрытия горизонтальной сдвинутой полосы внизу кадра, появляющейся при граблении видео со многими видеокартами с видеовходом (в т.ч. Miro DC), а также для скрытия других огрехов по краям кадра. Для скрытия этих огрехов можно было бы применить обрезание кадра, но для просмотра фильма на выходном устройстве (ТВ) с одновременным просматриванием на мониторе многие видеокарты требуют размеров сторон кадра фильма с кратностью 32, т.е. если мы хотим просматривать фильм одновременно на ТВ и мониторе, нам нужен фильм скажем 384х288, а не подрезанный до 380х280, в таком случае применяются шторки. Чтобы задать шторки по краям, надо установить флажок в пункте "Шторки" и отрегулировать их ширину кнопками [+][-] сверху, снизу, слева и справа.

Для выхода из интерактивного окна задания размеров, нужно нажать кнопку "Спрятать" (или "Вернуться").

Деинтерлейс (корректировка чрезстрочности).

Опции/Установки проекта/Видео. В поле "Структура видео", отмечаем пункт "Убрать построчность" (="деинтерлейс"). Обязательно отмечаем пункт "Сглаживание" (="Сглаживать только движение"). А в поле "Границы" (="Точность") задаем количество попугаев - чем меньше число, тем точнее сглаживание краев движущихся объектов, но тем медленнее кодирование фильма и меньше резкость картинки. Кроме того, это значение влияет на массу конечного файла - чем сильнее сглаживание (меньше значение), тем меньше поток и соответственно файл. По умолчанию это значение равно 20.

На контрольном примере в 30 секунд я проследил отличие значений сглаживания от 4 до 20 (4, 10, 15, 20). Получилось изменение потока от 1088 кбит (при 4) до 1304 кбит/с (при 20). Так что делая плавный деинтерлейс, мы еще и сокращаем размер конечного файла, при этом увеличивая время кодирования и уменьшая резкость картинки.

фласку часто хают за плохую интерполяцию чрезстрочности, даже не удосужившись прочитать readme. На самом деле то, что многие считают плохим деинтерлейсом, является интересным способом не уменьшать резкость картинки при уничтожении чрезстрочности. Применяя обычный деинтерлейс, скажем в Virtual Dub или PhotoShop, мы теряем резкость, т.к. происходит сглаживание, размывание (= blur) краев объекта - происходит усреднение цвета по ближайшим 8 точкам, а следовательно мы теряем информацию, а вместе с этим и резкость падает практически в 2 раза. Ведь не даром же пишут интерлейсные фильмы на DVD - такие фильмы более четкие, чем прогрессивные (с совмещенными полями), где при движении за объектом возникает размытое марево.

Фласка же предлагает оригинальный выход из этой ситуации. С одной стороны надо избавиться от визуальной полосатости движущихся объектов, с другой стороны не хотелось бы терять резкости остальной части кадра. Фласка предлагает отслеживать только движущиеся предметы, не размывая все остальное. Значение "Границы" (= "Точность") грубо говоря является показателем, на какое количество точек имеет право сдвинуться объект (ведь камера не стоит на месте, деревья немного колышутся под ветром и т.д.) перед тем, как его начнут размывать. Скажем по умолчанию 20, значит разница между местоположением объекта на двух наложенных полях может составлять 20 точек. Если объект сдвинулся более, чем на 20 точек, надо размыть (интерполировать) этот маленький участок.

Конечно 20 - это довольно много, но вот скажем сдвиг на 4-8 (а у некоторых и на 10-15) точек наш глаз обычно не улавливает (я не говорю о профессионалах, глаз которых улавливает разницу между 120 и 150 Гц на мониторе :)... Так что возможно мы и увеличим время кодирования и массу файла AVI, но резкость при этом будет выше, чем у кадра в два раза большего по размеру, но интерполированного обычным, "Дубовым" методом. Возражения принимаются - желающих оспорить прошу в Форум.

Количество кадров в секунду (frame rate).

Сокращенно КВС (FPS). Для уменьшения массы результирующего фильма мы можем уменьшить КВС. Но это чревато различными побочными эффектами. Дело в том, что от количества кадров зависит плавность движений объектов, актеров в кадре, и уменьшая fps мы получаем как бы мелкие подергивания.

Представьте движение объекта по кадру слева направо за 1 секунду. В одном случае мы имеем на его движение 3 кадра, в другом - 6. В первом случае мы зафиксируем только начало его движения слева, потом он визуально сразу переместится в центр кадра, а затем сразу окажется справа кадра, т.е. за время своего движения просто сделает два рывка по полю кадра. Теперь в случае с бОльшим количеством кадров - он появился слева, плавно сдвинулся на немного, еще на немного, вот он в центре, снова чуть сдвинулся, еще, и наконец появился на краю - мы увидели плавное перемещение объекта. Это конечно грубый пример, но наглядно показывающий, что мы теряем, уменьшая fps, особенно на средне-динамичных сценах.

На высокоскоростных сценах погони, полета снаряда и т.д. искажения от уменьшения фрэймрэйта меньше из-за размазанности и высокой скорости объектов, неуловимой глазом. В мультфильмах обычно и так используется около 15-20 fps. На неподвижных сценах фильмов мы тоже ничего не потеряем от этого. Среднескоростные сцены - человек при ходьбе, машина на низкой скорости, плавный сдвиг камеры - вот они при сравнении с оригиналом будут подергиваться. Если вас это не смущает, или вы кодируете слайд-шоу - можете смело выбрать в "Опции/Установки проекта/Видео/Базовая частота" нужный пункт. Единственное при этом замечание - не устанавливайте опцию "перестроить подвижные кадры" (="сохранить структуру дельта-кадров"), иначе вы получите сильные подергивания каждую секунду. Эта опция предназначена автором только для использования конвертации 24 fps прогрессивных фильмов в 23.97 fps и это не IVTC.

Работа с аудио потоком.

Если нам требуется переконвертировать АС3 поток в WAV (с дальнейшим сжатием его в mp3), то выбираем Опции/Установки проекта/Аудио/Кодировать аудио. А в Опции/Установки кодеров/[Select codec] Audio - WAV PCM 48 кГц, 16 бит, стерео. Если ваша аудиокарта не поддерживает 48, то сначала выставляем в Опции/Установки проекта/Аудио/44100 Hz (убрав крыжик у "Исходной частоты"), затем возвращаемся в Выбор аудиокодека и выбираем 44 кГц, 16 бит, стерео.

Выбор аудиокодека касается только случая перекодировки АС3 звука в WAV. Если вы хотите использовать АС3 в своем ДивХ фильме, придется вырезать его из VOB отдельным файлом - Опции/Установки проекта/Аудио/Без изменения.

Открыв [Select codec] Audio вы можете не обнаружить там кодека MP3. Если он вам очень нужен или вы не хотите терять времени на улучшение качества, то попробуйте закрыть программу и открыть ее снова с тем же файлом (закройте все открытые копии Фласки), либо перезагрузите систему. Если кодек не появится, попробуйте переустановить его в системе, иногда это помогает. Но лучше всего конечно использовать специализированные аудиопрограммы для сжатия в MP3. Например можно использовать ".mp3 Producer" от фирмы Fraunhofer. В этом случае ac3 или mp2 звук из VOB конвертируется сначала в WAV, а затем сжимается Продюсером.

Выбор фрагмента.

Если нам требуется переконвертировать весь открытый фильм, то ставим крыжик в пункте "Конвертить весь фильм" (="Обработать до конца фильма"), в закладке "Разное" ("Фрагмент"). Но если нам нужен не весь фильм, а только фрагмент, то запускаем внутренний плэер Фласки в меню "Запустить/Проверку" (="Просмотр"). Далее нажимаем кнопку [Play] и перетаскиваем ролик до нужного места, потом жмем [Stop], [Exit]. Фласка обычно начинает конвертировать фильм от последнего остановленного места, так что если вы просто просматривали фильм во встроенном плэере, а конвертить надо с начала файла, то не забудьте нажать в плэере кнопку [Seek First] - она отмотает ролик на начало. Затем заходим опять в "Опции/Уст.проекта/Разное" и либо отмечаем пункт "Конвертить до конца", либо задаем длину фрагмента в секундах, либо в кадрах.

Довольно трудно задать один и тот же кусок дважды во встроенном плэере - там нет никаких привязок и шкал. Хакнутый вариант Фласки (h1, h2) отличается тем, что можно задать в разделе "Разное" (="Фрагмент") начало фрагмента (правда в относительных единицах - порциях фильма), число устанавливается само, если передвинуть ролик во встроенном плэере, либо можно вставить число руками. Это дает нам возможность запомнив число в поле, при открытии этого же файла в следующий раз, выбрать идентичный фрагмент. Вариант "px3" тоже дает возможность более плавного смещения ролика, но там, как и в обычном варианте приходится устанавливтаь ролик "на глаз", кроме того, в этом варианте при сдвигании ролика лезут "артефакты".

Выбор пути и имени конечного файла и Конвертация.

После того, как мы задали кодек, фрагмент, изменение размера кадра, кроппинг, деинтерлейс, нам осталось задать только путь выходного файла. В закладке "Файлы" ("Опции/уст. проекта/") мы задаем путь и название конечного файла AVI. После этого нам остается выйти в меню "Запустить/Конвертер" и начнется конвертирование фильма. Если мы заметили в параметрах конвертации какую-либо оплошность (а параметры и превью выводятся в окне во время конвертации), можно остановить процесс кнопкой Cancel, исправить параметры и запустить конвертацию заново.

Чем отличаются вскрытые версии Фласки?

Версия h1, h2 (by doom9) показывает дополнительную статистику в окне конвертации и позволяет задать начало фрагмента в порциях MPEG-2 файла. h2 версия более наглядно работает в окне выбора размера кадра.

Версия рх3 (by miha) конвертит гораздо быстрее других версий, но говорят, что редко-редко, но допускает артефакты, я этого пока что не наблюдал.

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



(c) 02/2001, Сибирский Лихоман http://mydivx.lihoman.ru
Следующая статья раздела
Возврат на список статей