четверг, 3 июня 2010 г.

Видео кодирование: i против p

Многократно встречаются несправедливые мнения о том, что "интерлейс" (i: "interlaced") кодирование хуже по качеству чем обычное (p: "progressive", "прогрессивное"). Как человек, в своё время профессионально занимавшийся (хоть и кратковременно, но матчасть по этой теме знаю на отлично) разработкой графических видео-роликов для телевидения (3DS / 3DS Max), имею право на выражение моих знаний в этой области :)

Режим "interlaced" разработан специально для улучшения качества изображения в восприятии картинки человеком при том, что объём хранения видео данных при этом точно такой же, как и в обычном режиме.
В обычном режиме каждый кадр состоит из одного изображения, в результате чего вся видео-картинка обновляется 24 (или 25 или 30, соответственно кол-ву кадров в секунду) раз в секунду.
В "interlaced" режиме предусмотрено в 2 раза более частое обновление картинки, но не всего кадра, а каждой чётной и нечётной строки изображения в первую половину времени продолжительности каждого кадра и вторую соответственно. Таким образом изображение обновляется соответственно 48, 50 и 60 раз в секунду при тех же объёмах информации. Человеческий глаз устроен так, что не замечает, что при этом обновляются только чётные или нечётные строки изображения. Понятно, что фотофиксация такого полукадра (называемого "полем") при съёмке (или компьютерной визуализации) кадра происходит также в соответствующих половинных временных интервалах одного кадра.

Как "увидеть" разницу.

Это не составляет труда - обратите внимание, когда в фильмах режима "p" камера едет вбок, в то время, когда в кадре присутствуют вертикальные линии (например, угол дома) - явно заметно раздражающее мерцание таких линий.
Теперь возьмите любую любительскую видеокамеру (не фото, а именно видео) и произведите аналогичную съёмку, например, двигая вбок мимо угла вашего дома. Просмотрите запись - подобное мерцание не проявляется, глаз воспринимает движение гладко. Для более подробного изучения видеозапись можно сбросить на комп, но при этом очень важно: не пережимайте видео, а пишите видео с оригинальным кодеком (например, DV-AV). Прокрутите видео перегнав его на компьютер - эффект точно такой же, движения гладкие - родной DV-AV кодек поддерживает кодирование "i" и медиаплеер умеет его правильно проигрывать, отображать поля в правильные временные промежутки. Если рассмотреть кадры, снятые при таком боковом движении подробно, то на них явно будут видны поля, снятые и отображаемые, на самом деле, в разных временных промежутках каждого кадра.
В таком же режиме как правило идёт видео для новостей, живых съёмок как по эфирному так и кабельному, спутниковому вещанию. Исключение составляют, как правило, фильмы, которые снимают, как правило, в режиме "р" по неизвестным мне причинам, либо, возможно, что бы одну и ту же съёмку использовать как для кинотеатра (я так понимаю, что там не предоставляется технически возможным качественно проигрывать запись такого формата) так и для DVD.

Откуда всеобщее заблуждение и проблемы качества видео, которое было в оригинале снятое в режиме "interlaced".

Объясняется очень легко - подробности достоинств режима "interlaced" известна только людям, профессионально занимающимся видео. В то время, как недостатки этого же режима, связанное с пережатием, известна очень многим А именно проблема заключается в том, что сберечь вышеописанное достоинство, донося до конечного зрителя довольно проблематично при желании пережать или отредактировать видео. Например, повально всем известный способ кодирования MPEG4, благодаря которому 99% если не 100% людей имело возможность поделиться фильмами через интернет или записать их на CD болванку или как минимум посмотреть их у кого-то в гостях, ВООБЩЕ не предусматривает кодирования видео в режиме "interlaced"! Поэтому для записи "interlaced" видео при помощи такого кодирования есть только один выход - пережать видео так, что бы информация о каждом кадре представлялась цельным изображением. Часть изображения кадра, скрытая за снятыми чётными полями в момент времени, когда видеокамера снимала нечётные (и наоборот), безвозвратно утеряны, поэтому чистое "p" изображение из "i" получить нельзя. Поэтому цельное изображение кадра можно получить только тремя путями:
1) Самый простой способ, который применяет любой перекодировщик - склеить кадр из разных полей воедино, "забив" на то, что сняты они были для отображения в разные промежутки времени. В результате просмотра такого видео наблюдается раздражающая гребёнка, т.к. полукадры, предусмотренные для отображения в разные времена полукадров, теперь отображаются одновременно, и мы в каждом кадре видим чётные строки, предусмотренные для отбражения, например, сейчас, одновременно с нечётными, предусмотренными для отображения через 1/24/2=1/48ю долю секунды (при 24 к/сек), и так для каждого кадра. Минусы этого приёма более чем очевидны.
2) Второй способ избавиться от гребёнки - уменьшить кадр в 2 раза по высоте и ширине. При этом при уменьшении по высоте важно не смешивать изображение из двух соседних по вертикали точек, т.к. они являются фрагментами изображения, снятого в разные временные промежутки. Воспользоваться надо либо чётными либо нечётными строками. Минус этого приёма - это годится только для случая, когда вам подходит изображение, уменьшённое в 2 раза (по каждой из оси координат, или в 4 по площади).
3) Самый распространённый для наибольшего "качества" третий подход, произвести процедуру "deinterlace" - а именон, просто-напросто смешать содержимое соседних строк, при котором мы теряем во-первых, чёткость, во-вторых, в некоторых местах (при особо быстрых смещениях в кадре) что-то от гребёнки всё равно остаётся.
Рас уж столько сказал о пережатии, то добавлю, что в режиме MPEG4 также предусмотрены только пикселы с равными высотой и шириной, в то время как в DVD видео разрешение изображения 720*574, которое вытягивается в пропорции 4:3, то есть высота пиксела больше, чем его ширина. Для компенсации пропорции такое изображение перекодируемое для просмотра MPEG4 кодеками стоит растягивать по горизонтали до 768*576. Теоретически можно также и сжать по вертикали до 720*540 но при этом мы чуть потеряем качество (хотя... после уже проделанного деинтерлейса...) и, во-вторых, добавим каши при сжатии по вертикали наверх на кашу, полученную после деинтерлейса.

Так вот, красоту, которую мы наблюдаем, проигрывая видео, снятое камерой, на компьютере, к сожалению, невозможно закодировать нашим любимым кодеком DivX - он этого не поддерживает, так что либо красота не сжатая (или сжатая по профессиональным видео стандартам, например на DVD, при проигрывании которого всё от "а" до "я" предусмотрено поддерживать правильное отображение полей), либо сжимаем в DivX и теряем эту красоту.

Как добиться повышенного качества режима "interlaced" при перекодировании / редактировании видео, отснятого в этом режиме.

1) использовать кодеки, поддерживающие режим "interlaced" (например MPEG2) - к сожалению, при этом не получится сжать видео до таких размеров, как на это способен MPEG4.
2) использовать перекодировщик, который "умеет" обращаться с полями, и правильно из закодирует нужным кодеком.
3) если видео редактируется, то необходимо, что бы программа видео-редактор умела генерировать эффекты / титры / ... с аналогичными полями (для каждого полукадра эффекты накладывались отдельно на соответствующие поля, титры, либо любая другая графика, визуализировались для каждого кадра дважды в соответствующем временном интервале каждого полукадра, соответствующие строки (поля) точек (чётные либо нечётные) рассчитывается проекцией соответственного для данного временного промежутка отрендеренного (визуализированного) кадра компьютерной анимации - все объекты (например, титры) помещены в соответствующие для этого промежутка времени координаты). И, главное, что програма-видеоредактор должна уметь распознать поля, и не перемешать их при выводе смикшированного видео.
Можно добавить 4) не забыть использовать плеер (программу либо устройство), которое понимает этот кодек и корректно распознаёт в таком изображении поля и отображает в нужные временные промежутки.

И если хоть что-то в этой цепочке было использовано некорректно и поля потерялись - гребёнка
В общем, работать с режимом "interlaced" на несколько порядков сложнее, но если всё корректно сделано и используются правильные программы / плееры, то КАЧЕСТВО "INTERLACED" ВИДЕО НА ПОРЯДОК ВЫШЕ ОБЫЧНОГО.

Так вот, красоту, которую мы наблюдаем, проигрывая видео, снятое камерой, на компьютере (описано выше), к сожалению, невозможно закодировать нашим любимым кодеком DivX - он этого не поддерживает (не предусмотрено в MPEG4, вернее невозможно качественно поддерживать при использовании его методов сжатия изображения), так что либо красота не сжатая (или сжатая по профессиональным видео стандартам, например на DVD, при проигрывании которого всё от "а" до "я" предусмотрено поддерживать правильное отображение полей), либо сжимаем в DivX и теряем эту красоту. К сожалению, при использовании непрофессиональных кодировщиков и кодеков (результатами коих заполонён интернет) добиться этого невозможно :) И качество непрофессиональным образом i видео перекодированного в p выглядит с качеством на порядок меньшим чем натуральное p при таком же разрешении; при том, что на самом деле качество исходного i видео на порядок выше.

К сожалению, я не разбирался ещё с "interlaced" поддержкой для HD видео, но результат обязан быть аналогичным. В частности ничего не могу сказать о реальной поддержке "i" в MKV, TS... M2TS теоретически обязан поддерживать, т.к., по идее, является нативным форматом HD video. Ремуксовые в TS, наверное, также, т.к. TS в этом случае содержит, если не ошибаюсь, неперкодированную копию видео дорожки из M2TS (оригинальная кодировка видео дорожки на bluray диске).