Видео маппинг, видео перформансы

50 кадров в секунду - миф или реальность

Содержание материала

1. Зачем это нужно

Большая часть захваченного видео, с которым нам приходится работать, как правило, чересстрочное. Передачи с ТВ (о фильмах, которые были сняты изначально на пленку следует говорить отдельно, думаю, о них стоит говорить в отдельном материале), захват собственных видеосъемок, материалы с DVD - как правило, все это имеет чересстрочный формат кадра. Если мы захватываем и сохраняем материалы на DVD, для нас не имеет большой разницы, чересстрочное или прогрессивное видео заготавливаем "впрок". А вот если нет? Если нам обязательно нужно преобразовать чересстрочное видео в прогрессивное для дальнейшей работы с ним? Что мы теряем при таком преобразовании (деинтерлейсе)? Рассмотрим чуть подробнее:


1. Мы теряем в качестве. Любой, даже самый совершенный алгоритм деинтерлейса не сможет обеспечить идеальное преобразования 25i -> 25p (здесь и далее, 25i - чересстрочное видео, 25 кадров в секунду, 25p - прогрессивное), обязательно появятся артефакты, некоторые несоответствия, шумы, гало и пр, с которыми не всегда можно мириться. Если исходное видео достаточно зашумленное, деинтерлейс может значительно ухудшить картинку.
2. Мы теряем временнОе разрешение, плавность. Видео 25i на самом деле представляет из себя последовательность полей (поле - совокупность четных или нечетных строк кадра в чересстрочном видео, четные и нечетные поля чередуются в потоке последовательно, с промежутком в 1/25 секунды, со сдвигом по вертикали в один элемент) с разницей в 1/50 секунды. Если мы произведем конвертацию в 25p, мы получим последовательность кадров с разницей в 1/25 секунды, т.е. в два раза уменьшим разрешение по времени. И если на спокойном вялотекущем эпизоде это будет незаметно, то попробуйте сравнить, например, бег, полет шмеля, я не говорю уже о хоккейном матче. Также это будет заметно, если Вы во время съемки достаточно быстро водили объективом камеры туда-сюда - фильтр деинтерлейса обработает такую ситуацию очень плохо.

В качестве альтернативы я предлагаю конвертировать имеющееся видео 25i в прогрессивное 50p. Делается это просто: мы считаем поля в чересстрочном видео кадрами, т.е. делаем линейное преобразование потока. И тут у нас есть два варианта, как это сделать (демонстрация технических приемов будет во второй части, пока же я остановлюсь на достоинствах и недостатках обоих методов):

Обратите внимание! Захват видео будет производиться по прежнему, 25 кадров в секунду. Вся обработка идет уже после захвата!!! Не пытайтесь захватывать 50 кадров в секунду!!!

1. С сохранением разрешения поля. Т.е. преобразование опишется как 720x576x25i -> 720x288x50p (здесь и далее я буду работать с разрешением 720х576, как основным при захвате видеоизображения. Вы можете предпочитать 704х576 или 768х576 - разница будет только в числах, никак не в подходе).
2. С удвоением разрешения поля. Т.е. преобразование опишется как 720x576x25i -> 720x576x50p. Недостающие строки интерполируются из предыдущих полей.

Достоинства первого метода (их общие достоинства мы уже обсудили выше):
1. Не производится никаких действий с изображением. Т.е. поля превратились в кадры и все. Легко можно произвести обратное преобразование. Если предположить, что битрейт при финальном кодирование будет достаточно высок, то, в идеале, если в будущем нам понадобится снова чересстрочное видео, мы легко его получим.
2. Мы не увеличили количества пикселей за единицу времени. У нас как было 704*576*25, так и осталось. Значит, мы не сильно должны увеличивать битрейт финального кодирования по сравнению с 25кадровым вариантом (реально нам придется все-таки его увеличить - современные кодеки лучше работают в режиме большее разрешение + меньшая частота кадров, нежели наоборот)

Недостатки первого метода:
1. Четные поля сдвинуты на один элемент вниз (или вверх - зависит от формата Вашего видео) относительно нечетных. Этот недостаток легко решается технически.
2. При проигрывании мы имеем в два раза сплюснутую по вертикали картинку. Эта проблема также решается технически, причем разными способами - каждый выберет подходящий для себя.
3. Вытекающий из второго недостатка: при масштабировании в два раза по вертикали мы увеличим артефакты кодирования также в два раза. Можно сказать, это единственный реальный минус первого подхода по сравнению со вторым.

Достоинства второго метода:
1. Нет необходимость в масштабировании по вертикали.
2. Нет проблем с тремором ("прыганием" картинки вверх-вниз из-за сдвига полей относительно друг-друга)

Недостатки второго метода:
1. Необходимость значительно увеличить битрейт при финальном кодировании в сравнении с 25p
2. Артефакты, проявляющиеся вследствие интерполяции. Они, конечно, меньше, чем при обычном деинтерлейсе, но есть, и заметны.
3. Только достаточно мощные процессоры способны справиться с декодированием фильмов, созданных с использованием данного метода, тогда как ресайз, необходимый для первого, гораздо менее процессороемок.

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


2. Как это сделать.

Как всегда, я буду рассматривать работу с видео на базе популярной программы монтажа - VirtualDub. Рекомендую скачать последнюю версию (если у вас компьютер на базе Intel PIV, скачайте версию, оптимизированную под него)



1. Самый простой способ.
Если Вы желаете работать только со вторым методом, и у Вас видео захвачено с использованием MJPEG-кодека, все что Вам необходимо, это при открытии видеофайла в Dub'е,



выбрать дополнительно галочку "Popup extended dialog options", после этого Вы попадете в окно опций открытия файла.


Нас интересует раздел "Motion-JPEG (MJPEG) options". Вам следует выбрать один из двух вариантов "Split interlaced frames into two fields and double framerate". Какой из вариантов следует выбрать, Вы можете предположить, если знаете структуру Вашего видеопотока, или экспериментально: выберите вначале первый, стрелками вправо-влево прокрутите открывшийся фильм по кадрам: если убедитесь, что персонажи в кадре дергаются вперед-назад по ходу фильма, значит, следует выбрать другой вариант.
После открытия таким образом видеофильма, Вам остается увеличить его разрешение по вертикали в два раза, одновременно избавившись от тремора. Этим занимается фильтр SmartBob.


Вкратце о его настройках:
Threshold - основная опция фильтра, чем больше значение, тем видео считается менее интенсивным по движению в кадре. Буквально: чем больше показатель, тем больше информации будет взято из предыдущего кадра. Особый случай, когда значение составит 0 - это означает, что при создании кадра не будет взята никакая информация их предыдущего, т.е. будет сделано простое масштабирование. Автор фильтра рекомендует использовать значения 10-25, я бы порекомендовал 12 - 20 для чистого видео, 15-25 для зашумленного.
Motion Map Denoising - включается фильтр, который позволяет отличить реальное движение объекта в кадре от случайного, вызванного шумом. Рекомендую всегда включать эту опцию, однако, следует учесть, что она замедляет работу фильтра.
Show Motion Areas only - при заданных установках покажет, какие участки видео фильтр считает движущимися
Even-numbered frames (0-based) contain top fields - сообщает фильтру порядок полей. Необходимо для убирания вертикального тремора. Если после наложения фильтра картинка "прыгает вверх-вниз", измените эту опцию

Итак, после наложения SmartBob, мы получаем видео 720х576х50p, дальше работаем с ним, как с обычным прогрессивным видео, кто как привык.

2. С применением AVISynth.
Я прекрасно помню, как вначале долго не мог уговорить себя поставить "какой-то там AVISynth да еще и бета 0.3" на компьютер. Но поставил, очень быстро разобрался. Он прост в использовании, очень эффективен при фреймсервинге, устранении десинхронизации, и во многих других вещах. Итак, нужно его скачать и поставить.
После того, как мы поставили AVISynth, мы можем начать работу с видео.
Для того, чтобы как и в предыдущем случае произвести конвертацию по второго методу, создадим файл любое_имя.avs, в котором будут следующие строки:

clip=AVISource("Имя_Вашего_видеофайла.avi")
clip.SeparateFields


Теперь откроем этот файл в VirtualFub'е, добавим все тот же фильтр SmartBob и все готово.

Чтобы провести конвертацию по первому методу, нам придется потрудиться чуть больше. Создадим файл любое_имя.avs, в котором напишем:

clip=AVISource("Имя_Вашего_видеофайла.avi")
Crop(Interleave(clip.SeparateFields.SelectOdd.AddBorders(0,1,0,0),clip.SeparateFields.SelectEven.AddBorders(0,0,0,1)),0,1,-0,-0)


Чуть подробнее разберем, что же я тут написал (вообще-то к AVIsynth'у идет замечательный HELP!)
Мы открываем видеофайл (AVISource),разделяем поля (SeparateFields), затем последовательно выбираем четные (SelectEven) и нечетные поля (SelectOdd), сдвигаем одно из них вниз на пиксель (AddBorders(0,1,0,0)), к другому добавляем снизу пиксель (AddBorders(0,0,0,1)), чтобы сохранить разрешение, объединяем все это в один файл, но уже представляя поля как кадры (Interleave), и слегка обрезаем виде сверху (на один пиксель) (Crop) (Если ничего не понятно, просто скопируйте к себе в файл, замените имя файла на свое, потом разберетесь )
Теперь открываем файл в VirtualDub'е, проверяем при помощи стрелок вправо-влево, правильно ли мы учли последовательность полей. Если видео дергается, значит, необходимо переписать наш AVS-файл и открыть его заново. Всего в нашем случае может быть четыре варианта чередования полей. Один вариант я уже представил, вот еще три:

Crop(Interleave(clip.SeparateFields.SelectOdd.AddBorders(0,0,0,1),clip.SeparateFields.SelectEven.AddBorders(0,1,0,0)),0,1,-0,-0)
Crop(Interleave(clip.SeparateFields.SelectEven.AddBorders(0,1,0,0),clip.SeparateFields.SelectOdd.AddBorders(0,0,0,1)),0,1,-0,-0)
Crop(Interleave(clip.SeparateFields.SelectEven.AddBorders(0,0,0,1),clip.SeparateFields.SelectOdd.AddBorders(0,1,0,0)),0,1,-0,-0)


Мы должны найти вариант, при котором исключены как горизонтальный, так и вертикальный тремор (дрожание). Однако, бывают случаи (как правило, при оцифровке с VHS), когда вертикальный тремор убрать невозможно, либо существует лого, присутствующее на протяжении всего фильма. Тогда можно воспользоваться скриптом, написанным KPOBOCOC'ом :

function make50fps( clip c )
{
# разделим видео на поля и увеличим размер по вертикали в 2 раза
c2 = c.separatefields.bicubicresize( c.width, c.height )
# разделим видео на 2 клипа: отдельнор четные и нечетные поля
ctop = c2.SelectOdd
cbot = c2.SelectEven
# сдвинем на 1 пиксель поля (т.е. на пол-пикселя для исходного размера полей)
dtop = ctop.crop( 0, 0, ctop.width, ctop.height-1 ).bicubicresize( ctop.width, ctop.height / 2 )
dbot = cbot.crop( 0, 1, cbot.width, cbot.height-1 ).bicubicresize( cbot.width, cbot.height / 2 )
#
Interleave( dtop, dbot )

# для контроля
# bicubicresize( c.width, c.height )
}
ccc = AVISource("Имя_Вашего_видеофайла.avi")
make50fps(ccc)


Однако, следует учесть, что в этой функции производится масштабирование, как следствие слегка падает детализация.
Естественно, при пользовании данной функции необходимо также не забывать о порядке полей, при необходимости поправить функцию.
Открытое в Dub'е видео представляет собой поток с разрешение 720х288х50p. С ним можно работать также, как с любым прогрессивным потоком.


3. Тонкости при работе с 50 fps.

Следует помнить, что и для первого метода и для второго необходим больший (по сравнению с 25 fps) битрейт для финального кодирования в : на 10-20% - для первого, 70-100% для второго.
А вот ключевые кадры следует расставить реже, чем для 25fps - до двух раз реже.
Если исходное видео было захвачено с VHS/video8, рекомендую отресайзить его до 512х192 для первого метода, до 512х384 - для второго.

4. Просмотр такого видео

Видео, созданное вторым методом, будет замечательно проигрываться компьютером с мощным процессором (у меня на PIV-1800 процессор грузится на 80-90%, при этом нужно помнить, что при использовании видеокарт серии Radeon 9500/9600/9700/9800 и плеера DivXPlayer используется технология FULLSTREAM, которая позволяет значительно снизить нагрузку на процессор при декодировании DivX (начиная с драйверов Catalyst 3.4)), нормально выводится при этом на телевизор (тестировалось на радеонах)
Видео, созданное при помощи первого метода, необходимо отмасштабировать для просмотра. Это можно сделать при помощи следующих подходов:
1. Плеер сам отмасштабирует. Например, в ZoomPlayer'е поставить соотношение сторон 4:3, он сам отмасштабирует.
2. На диск с фильмом записать AVS-скрипт, в котором сделать ресайз. Обычно я так делаю.
3. Предполагаю, что в заголовке AVI можно прописать ручками соотношение сторон. Пока изучаю этот подход.

Теперь о выводе видео с компьютера на телевизор при использовании первого метода. Я обычно создаю еще один AVS-скрипт, в котором делаю обратный процесс - конвертацию 50p -> 25i для вывода на телевизор. RageTheater замечательно "кушает" такое подготовленное видео.

А вот и скрипты для вывода на ТВ

1. Скрипт, который просто преобразует назад Ваш 50p в 25i:

clip=AVISource("Имя_Вашего_файла_50_fps.avi")
Weave(AssumeFieldBased(clip))


Если видеокарточка нормально настроена на вывод полей, или Вам просто надо снова получить чересстрочное видео.

2. Скрипт, который просто преобразует Ваш файл для просмотра фильма на ТВ, даже если карточка настроена неправильно (делается Bob, т.е. удвоение линий, при этом оверлей будет брать четную строку из четного кадра, нечетную - из нечетного для отображения на ТВ. Такой принцип вывода с оверлея работает на Радеонах, про другие карты утверждать не берусь):

clip=AVISource("Имя_Вашего_файла_50_fps.avi")
Bob(AssumeFieldBased(clip))


5. Проблемы, мысли вслух и прочее.

Встает вопрос: а зачем все это нужно было? Ведь DivX, начиная с версии 5.03 умеет сжимать и чересстрочное видео. Так давайте этим и пользоваться!
- Во-первых, сжимает он его пока плохо. Во-вторых, многие фильтры в Dub'е лучше работают с прогрессивным видео. В-третьих, у самого DivX пока нет постфильтра, который бы делал деинтерлейс для показа фильма на мониторе:
А как быть с аппаратными проигрывателями, типа Xoro DVD, которые будут проигрывать DivX?
-Пока непонятно. Я не вижу технических проблем, по которым они бы не могли проигрывать 50fps, полученный первым методом. Это же мне подтвердил в приватной беседе один из инженеров одной из компаний, которые планируют выпуск подобных DVD-проигрывателей (по понятным причинам, имя и компанию я не публикую). Так что вопрос скорее политический, а может быть, решаться будет очень просто

EventCatalog.ru — всё для организации мероприятий!