14.2. Как работать с телесином и чересстрочной развёрткой на NTSC DVD

14.2.1. Введение

Что такое телесин?  Если Вы не понимаете многое из того, что здесь написано, прочтите статью Википедии о телесине. Это понятное и разумно обширное описание того, что такое телесин.

Замечание о числах.  Многие документы, включая указанное выше руководство, ссылаются на количество полей в секунду 59.94 для NTSC видео и соответствующие кадровые частоты 29.97 (для подверженного телесину и чересстрочного видео) и 23.976 (для построчного). Для простоты в ряде статей эти числа даже округляются до 60, 30 и 24 соответственно.

Строго говоря, все эти числа являются аппроксимациями. Чёрно-белое NTSC видео было точно с 60 полями в секунду, но позже была выбрана частота 60000/1001 для адаптации цветовой информации с одновременным сохранением совместимости с чёрно-белым телевидением. Цифровое NTSC видео (такое как на DVD) также с 60000/1001 полями в секунду. Отсюда возникла кадровая частота 30000/1001 кадр/сек для чересстрочного и телесиненного видео; построчное видео идёт с 24000/1001 кадр/сек.

Старые версии документации MEncoder и много архивных сообщений из списков рассылки ссылаются на 59.94, 29.97 и 23.976. Вся документация MEncoder была обновлена для использования дробных значений, и Вам так же следует их использовать.

-ofps 23.976 — неправильно. Взамен нужно использовать -ofps 24000/1001.

Как используется телесин.  Всё видео, предназначенное для просмотра на NTSC телевидении должно быть с 60000/1001 полями в секунду. Фильмы, сделанные для показа на TV часто снимаются непосредственно при 60000/1001 полей в секунду, но большинство кино снимается на 24 или 24000/1001 кадрах в секунду. В процессе создания DVD с кинофильмом, видео преобразуется для телевидения с помощью процесса, называемого телесин.

В действительности, видео никогда не хранится на DVD с 60000/1001 полями в секунду. Для видео, оригинально являющегося 60000/1001, каждая пара полей объединяется для формирования кадра, приводя к 30000/1001 кадрам в секунду. Затем аппаратные DVD плееры читают флаг, включенный в видеопоток, для определения того какие, чётные или нечётные строки должны формировать первый кадр.

Обычно, содержимое с частотой кадров 24000/1001 остаётся неизменным при кодировании на DVD и DVD плеер должен выполнить телесин на лету. Однако, иногда видео подвергается телесину до записи на DVD; и хотя оно изначально было с 24000/1001 кадр/сек, видео становится с 60000/1001 полями в секунду. Когда оно сохраняется на DVD, пары полей объединяются для формирования 30000/1001 кадров в секунду.

При рассмотрении отдельных кадров, полученных из 60000/1001 полей в секунду, телесиненных или наоборот, чересстрочная развёртка чётко видна в случае, если есть какое-либо движение, поскольку одно поле (скажем, с чётными номерами строк) отображает момент времени на 1/(60000/1001) секунды позже, чем другое поле. Воспроизведение чересстрочного видео на компьютере выглядит скверно по двум причинам: монитор обладает более высоким разрешением и видео показывается покадрово, вместо отображения по полям.

Замечания:

  • Этот раздел применим только к NTSC DVD, а не к PAL.

  • Примеры командных строк MEncoder в данном разделе не предназначены для реального использования. Они просто являются минимально необходимым требованием для кодирования соответствующей категории видео. То, как сделать хорошие DVD рипы или тонко настроить libavcodec для достижения максимального качества, не входит в рамки данного раздела.

  • Есть несколько сносок, специфичных для данного руководства, обозначенных следующим образом: [1]

14.2.2. Как распознать тип Вашего видео

14.2.2.1. Построчная развёртка

Видео с построчной развёрткой изначально записывается на 24000/1001 fps и сохраняется на DVD без чередования.

При воспроизведении DVD с построчной развёрткой в MPlayer, MPlayer выведет следующую строку при начале воспроизведения фильма:

demux_mpg: обнаружено 24000/1001 кадра/сек NTSC содержимое с построчной развёрткой,
переключаю частоту кадров.

Начиная с этого момента, demux_mpg никогда не должен сообщать о том, что найдено "30000/1001 кадров/сек NTSC содержимое".

При просмотре видео с построчной развёрткой Вы не должны никогда наблюдать чересстрочность. Однако, будьте осторожны, поскольку иногда есть небольшая примесь телесина там, где Вы этого не ожидаете. Мной наблюдались DVD с TV-шоу, у которых была одна секунда телесина при каждой смене сцен или в случайных на вид местах. Однажды я видел DVD, у которого одна половина была с построчной развёрткой, а вторая — телесиненной. Если Вы желаете быть действительно уверенными, Вы можете просканировать весь фильм:

mplayer dvd://1 -nosound -vo null -benchmark

Использование -benchmark позволяет MPlayer воспроизводить фильм столь быстро, сколь это возможно; тем не менее, в зависимости от Вашего железа, это может занять некоторое время. Всякий раз, когда demux_mpg будет сообщать об изменении частоты кадров, строка прямо над сообщением покажет Вам время, при котором произошло изменение.

Иногда видео на DVD с построчной развёрткой называют "мягким телесином", поскольку предполагается, что телесин будет выполнен DVD плеером.

14.2.2.2. Телесин

Телесиненное видео изначально снимается на 24000/1001 кадр/сек, но подвергается телесину до записи на DVD.

MPlayer не (всегда) сообщает об изменении частоты кадров при воспроизведении телесиненного видео.

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

  1. mplayer dvd://1
  2. Переместитесь в часть фильма с движением.

  3. Используйте клавишу . для покадровой перемотки вперёд.

  4. Наблюдайте за последовательностью кадров с чересстрочной и построчной развёрткой. Если Вы видите следующую структуру: ЧЧЧПП,ЧЧЧПП,ЧЧЧПП,... (где Ч — чересстрочные, а П — построчные кадры), значит видео телесиненное. Если Вы наблюдаете иную структуру, видео может быть телесиненным, используя какой-либо нестандартный метод; MEncoder не может преобразовать без потерь нестандартный телесин в построчную развёртку. Если Вы не видите вообще никакой структуры, значит наиболее вероятно, что видео с чересстрочной развёрткой.

Иногда подверженное телесину видео на DVD называют "жестким телесином". Поскольку жесткий телесин уже имеет 60000/1001 полей в секунду, DVD проигрыватель, воспроизводя его, не делает никаких преобразований.

Другой способ выяснить, был Ваш источник подвержен телесину или нет, заключается в воспроизведении исходного материала с опциями командной строки -vf pullup и -v, чтобы увидеть, как pullup сопоставляет кадры. Если источник был телесиненным, Вы должны увидеть в консоли 3:2 структуру с чередующимися 0+.1.+2 и 0++1. Преимущество этой техники состоит в том, что не требуется просматривать исходный материал для его идентификации, это может быть полезно для автоматизации процедуры кодирования или выполнения вышеуказанной процедуры удаленно через медленное соединение.

14.2.2.3. Чересстрочная развертка

Чересстрочное видео изначально снималось на 60000/1001 полями в секунду, и сохранялось на DVD с 30000/1001 кадрами в секунду. Эффект чересстрочности (часто называемый "гребёнкой") — результат объединения пары полей в кадры. Поля сдвинуты друг относительно друга на 1/(60000/1001) секунды, и, когда отображаются одновременно, разница заметна.

Как и с подверженным телесину видео, MPlayer не должен сообщать о каких-либо изменениях частоты кадров при воспроизведении чересстрочного содержимого.

Внимательно, кадр за кадром (при помощи клавиши .) рассматривая чересстрочное видео, Вы увидите, что каждый отдельный кадр — чересстрочный.

14.2.2.4. Смешанные построчная развертка и телесин

Все видео со "смешанными построчной разверткой и телесином" изначально было с 24000/1001 кадрами в секунду, но некоторые его части оказались подвержены телесину.

Когда MPlayer воспроизводит эту категорию, он будет (как правило, периодически) переключаться между "30000/1001 кадров/сек NTSC содержимым" и "24000/1001 кадра/сек NTSC содержимым с построчной развёрткой". Смотрите конец вывода MPlayer, чтобы увидеть эти сообщения.

Вам следует проверить разделы с "30000/1001 кадров/сек NTSC содержимым", чтобы убедиться, что видео действительно телесиненное, а не просто чересстрочное.

14.2.2.5. Смешанные построчная и чересстрочная развертки

В содержимом со "смешанными построчной и чересстрочной развертками", построчное и чересстрочное видео переплетаются друг с другом.

Эта категория выглядит также, как и "смешанные построчная развертка и телесин", до тех пор, пока не проверите разделы 30000/1001 кадр/сек и не увидите, что структура телесина отсутствует.

14.2.3. Как кодировать каждую категорию

Как уже было сказано выше, последующие примеры командных строк MEncoder не означают, что надо использовать именно их; они всего лишь примеры минимального набора параметров для правильного кодирования каждой категории.

14.2.3.1. Построчная развертка

Видео с построчной разверткой не требует специальной обработки для кодирования. Единственный нужный Вам для уверенности параметр — это -ofps 24000/1001. В противном случае MEncoder будет пытаться кодировать с 30000/1001 кадрами в секунду и создаст дублирующиеся кадры.

mencoder dvd://1 -oac copy -ovc lavc -ofps 24000/1001

Частый случай, однако, когда видео, выглядящее построчным, на самом деле содержит очень короткие подверженные телесину части. Если Вы не уверены, безопаснее будет считать его как видео со смешанными построчной разверткой телесином. Потеря скорости невелика[3].

14.2.3.2. Телесин

Телесин может быть обращён для получения оригинального 24000/1001 содержимого при помощи процесса, называемого обратный телесин. MPlayer содержит несколько фильтров для выполнения этого; лучший из них, pullup описан в разделе смешанные построчная развертка и телесин.

14.2.3.3. Чересстрочная развертка

На практике в большинстве случаев невозможно получить полностью построчное видео из чересстрочного содержимого. Единственный способ сделать это без потери половины вертикального разрешения - это удвоить частоту кадров и попытаться "угадать", что должно составить соответствующие линии каждого поля (этот способ имеет недостатки, смотрите метод 3).

  1. Кодируйте видео в чересстрочной форме. Обычно это наносит вред способности кодировщика хорошо сжимать, но libavcodec имеет два параметра специально для чуть лучшего сохранения чересстрочного видео: ildct и ilme. К тому же, настоятельно рекомендуется использовать mbd=2[2], потому что при этом макроблоки в местах без движения будут кодированы как нечересстрочные. Имейте в виду, что -ofps здесь НЕ нужна.

    mencoder dvd://1 -oac copy -ovc lavc -lavcopts ildct:ilme:mbd=2

  2. Используйте фильтр деинтерлейсинга перед кодированием. Существует несколько таких фильтров на выбор, каждый имеет свои преимущества и недостатки. Обратитесь к mplayer -pphelp и mplayer -vf help для определения доступных (grep по "deint"), прочтите Сравнение фильтров деинтерлейсинга Майкла Нидермайера (Michael Niedermayer), и поищите в списках рассылки MPlayer, чтобы найти множество обсуждений различных фильтров. И опять, частота кадров не меняется, поэтому никаких -ofps. к тому же деинтерлейсинг следует производить после обрезания [1] и до масштабирования.

    mencoder dvd://1 -oac copy -vf yadif -ovc lavc

  3. К сожалению, эта опция сбоит с MEncoder; она должна хорошо работать с MEncoder G2, но его пока нет. Вы можете столкнуться с крахами. Как бы то ни было, назначение опции -vf tfields — создать полный кадр из каждого поля, что делает частоту кадров равной 60000/1001. Преимущество этого подхода в том, что никакие данные не теряются; однако, т.к. каждый кадр получается только из одного поля, недостающие строки должны как-то интерполироваться. Не существует очень хороших методов генерации недостающих данных, поэтому результат будет выглядеть несколько похожим на применение некоторых фильтров деинтерлейсинга. Генерация недостающих строк также создает другие проблемы, просто потому что количество данных удваивается. Таким образом, для сохранения качества требуются более высокие значения битпотока, и больше ресурсов процессора используется как для кодирования, так и для декодирования. tfields имеет несколько различных опций, определяющих способ создания недостающих строк каждого кадра. Если выбрали этот способ, обратитесь к руководству и выберите ту опцию, которая лучше подходит для Вашего материала. Имейте в виду, что при использовании tfields Вы должны указать как -fps, так и -ofps, установив им значение, равное удвоенной частоте исходного материала.

    mencoder dvd://1 -oac copy -vf tfields=2 -ovc lavc \
        -fps 60000/1001 -ofps 60000/1001

  4. Если планируете сильно уменьшать размер изображения, можно извлекать и декодировать только одно поле из двух. Конечно, Вы потеряете половину вертикального разрешения, но если планируется уменьшать размер как минимум вдвое, потеря будет не сильно заметна. В результате получится построчной развёртки файл с 30000/1001 кадрами в секунду. Процедура следующая: -vf field, затем обрезание [1] и масштабирование соответствующим образом. Помните, что потребуется скорректировать масштабирование для компенсации уменьшенного вдвое вертикального разрешения.

    mencoder dvd://1 -oac copy -vf field=0 -ovc lavc

14.2.3.4. Смешанные построчная развертка и телесин

Для преобразования видео со смешанными построчной разверткой и телесином в полностью построчное необходимо к подверженным телесину частям применить обратный телесин. Есть три описанных ниже способа добиться этого. Заметьте, что следует всегда применять обратный телесин до какого-либо масштабирования; за исключением случая, когда Вы точно знаете, что делаете, выполняйте обратный телесин также до обрезания [1]. -ofps 24000/1001 здесь необходима, поскольку видео на выходе будет с 24000/1001 кадрами в секунду.

  • -vf pullup разработана для обратного телесина материала, телесину подверженного, оставляя построчные данные как есть. Для правильной работы после pullup должен следовать фильтр softskip, иначе произойдет крах MEncoder. pullup является, однако, самым чистым и точным методом, доступным для кодирования и телесина, и "смешанного построчного с телесином".

    mencoder dvd://1 -oac copy -vf pullup,softskip \
        -ovc lavc -ofps 24000/1001

  • Более старый метод заключается не в применении обратного телесина к телесиненным частям, а, наоборот, в телесине не подверженных телесину частей и последующем применении обратного телесина ко всему видео. Звучит запутанно? softpulldown — это фильтр, проходящий по видео и делающий телесиненным весь файл. Если следом за softpulldown указать либо detc, либо ivtc, финальный результат будет полностью построчным. -ofps 24000/1001 необходима.

    mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001
      

  • Лично я не использовал -vf filmdint, но вот что сказал Д Ричарт Фелкер III (D Richard Felker III):

    С ним все в порядке, но имхо он слишком часто пытается сделать деинтерлейс iвместо обратного телесина (в точности как аппаратные DVD проигрыватели & построчное TV), что в результате дает мерзкое мерцание и другие артефакты. Если собираетесь его использовать, потребуется как минимум потратить немного времени для тонкой настройки опций и просмотра результата, чтобы убедиться, что он не испорчен.

14.2.3.5. Смешанные построчная и чересстрочная развертки

Существует две опции для этой категории, каждая из которых — это компромисс. Вы должны выбрать, исходя из продолжительности/положения каждого типа.

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

    Эта опция определенно не должна использоваться, если Вы хотите со временем отображать видео на чересстрочном устройстве (с помощью TV карты, например). Если у Вас есть чересстрочные кадры в видео с 24000/1001 кадрами в секунду, к ним, как и к прогрессивным, будет применен телесин. Половина их чересстрочных "кадров" будут отображаться с длительностью трех полей (3/(60000/1001) секунд), давая в результате неприятно выглядящий эффект "прыжка назад во времени". Даже если Вы пробуете это, Вы должны использовать фильтр деинтерлейсинга, такой как lb или l5.

    Для отображения на построчном дисплее это тоже может быть плохой идеей. Будут отбрасываться пары последовательных чересстрочных полей, приводя к разрывам, которые могут быть заметнее, чем при использовании второго метода, отображающего некоторые построчные кадры дважды. Чересстрочное видео с 30000/1001 кадрами в секунду уже несколько прерывисто, потому что в реальности оно должно отображаться с 60000/1001 полями в секунду, так что дублирующиеся кадры не так сильно выделяются.

    Так или иначе, лучше всего проанализировать Ваше содержимое и как Вы его собираетесь показывать. Если видео на 90% построчное и Вы никогда не будете показывать его на TV, Вам следует отдать предпочтение построчному варианту. Если оно только наполовину построчное, Вы, возможно, захотите кодировать его, как если бы оно было чересстрочным.

  • Считайте его чересстрочным. Некоторые кадры построчной части потребуют дублирования, что даст в результате некоторое скачкообразное дрожание. И снова, фильтры деинтерлейсинга могут несколько ухудшить построчные части.

14.2.4. Примечания

  1. Об усечении сторон:  Видеоданные на DVD хранятся в формате, называемом YUV 4:2:0. В YUV видео, люма ("яркость") и хрома ("цвет") хранятся отдельно. Поскольку человеческий глаз отчасти менее чувствителен к цвету, чем к яркости, в YUV 4:2:0 изображении присутствует только один цветностный пиксел на четыре яркостных. В изображении с построчной развёрткой каждый квадрат из четырёх яркостных пикселов (два на два) имеют один общий цветностный пиксел. Вы должны обрезать построчный YUV 4:2:0 до чётных размеров и использовать чётные смещения. Например, crop=716:380:2:26 — правильно, а crop=716:380:3:26 — нет.

    Когда имеете дело с чересстрочным YUV 4:2:0, ситуация чуть более сложная. Вместо разделения одного цветностного пиксела четырьмя яркостными пикселами в кадре, каждые четыре яркостных пиксела каждого поля разделяют цветностный пиксел. Когда поля объединены в кадр, каждая строка имеет высоту в один пиксел. Теперь, вместо квадрата из четырех яркостных пикселов мы имеем два соседних пиксела, а два других расположены на две строки ниже. Два яркостных пиксела следующей строки принадлежат другому полю, и, поэтому, разделяют другой пиксел цветности с двумя пикселами на две строки дальше. Вся эта неразбериха требует, чтобы вертикальные размеры и смещения обрезания были кратны четырем. Горизонтальные могут оставаться четными.

    Для телесиненного видео я рекомендую производить обрезание после обратного телесина. Так как видео построчное, достаточно обрезать только по четным размерам. Если же действительно хотите получить небольшую прибавку к скорости, которую может дать обрезка, Вам придется производить усечение с вертикальными размерностями, кратными четырем. В противном случае фильтр обратного телесина не будет иметь правильных данных.

    Для чересстрочного (не подверженного телесину) видео, Вы всегда должны производить усечение с вертикальными размерностями, кратными четырем, если только не используете -vf field перед усечением.

  2. О параметрах кодирования и качестве:  Если я здесь рекомендую mbd=2, это еще не значит, что эту опцию не следует использовать где-либо еще. Совместно с trell, mbd=2 является одной из двух опций libavcodec, которые значительно увеличивают качество. Вам всегда следует использовать как минимум эти две, за исключением случая, когда потеря скорости кодирования недопустима (например, кодирование в реальном времени). Есть множество других libavcodec опций, улучшающих качество (и замедляющих кодирование), но их описание выходит за рамки этого документа.

  3. О производительности pullup:  Использование pullup (совместно с softskip) для видео с построчной развёрткой вполне безопасно и обычно является хорошей идеей, если только про источник не известно достоверно, что он полностью построчный. Потеря скорости мала в большинстве случаев. В минимальном варианте кодирования pullup замедляет MEncoder на 50%. Добавление обработки звука и продвинутых lavcopts опций затмевает эту разницу, уменьшая падение производительности от использования pullup до 2%.