Что если видеоизображение ТВ-тюнера выводится как бы чересстрочно, особенно заметно при быстром движении объектов на экране

  • 20 июля 2010
  • 4k

Этот дефект называется обычно "гребенкой" или "расческой". Он хорошо заметен на больших разрешениях (более 352x288) при наличии горизонтально движущихся объектов. По большому счету называть эту особенность вывода видеоизображения "дефектом" не правильно. Поскольку это так задумано. Это черезстрочный (интерлейсный) вывод видеоизображения.

Наверное лучше один раз увидеть, чем 100 раз услышать.

   

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


Григорий:
Расческа - не дефект карты, а дефект Windows. Карты работают по правилам, придуманным MS лет десять назад, в эпоху создания Video for Windows. Хочешь иметь совместимость с этой системой - следуй интерфейсу. Не хочешь - иди на ... Silicon Graphics, или еще куда, где про видео больше знают...
Еще. Сами эти карты позволяют разделять поля и засылать данные в разные адреса памяти. Более того, у них НЕТ буфера на кадр, они могут только передавать в экранный буфер сначала нечетные, а потом четные строки. Пока идет одно поле, второго НЕТ! Хранить данные от текущего поля НЕГДЕ! Вот карточка и шлет их в те строки буфера, в какие может. Если число строк <=288, то второе поле вообще игнорируется - нету для него строк в буфере, не дали. Если строк > 288, то как их поделить на все 576? Я не знаю, но самое простое - первые 288 записать с некоторыми промежутками, по числу N-288. В них вставить строки из второго поля. Ну нет тут никакого криминала, просто надо принять решение, его и принимают как сложится.

Если строк 576, то все хорошо, имеем идеальную расческу. Если меньше, то число зубцов будет меньше, и расти они будут через несколько строк. Чего здесь удивительного? Чего исследовать? И так все ясно. Не разрешает VFW показывать 50 кадров в секунду. Вообще не разрешает. Поэтому второе поле можно только в первому приделать. Так и в DV делается, без всяких тюнеров. Просто нет другого выхода. M$ не разрешил.<br>
А вот дальше, на мониторе, появляется много интересного. Если делать размер картинки какой попало, то вот эта, даже идеальная, расческа начнет уже видеокартой масштабироваться на что попало. То чего при этом наинтерполируется, дает богатую пищу для сравнений. Вот только... сравниваются разные видео карты, а не тюнеры. И еще разные способы делать неправильно неправильные вещи. Я уже это говорил много раз, в разных местах.

Да, есть правильный способ resize. Есть и правильный способ показа, вытекающий из него. Adobe Premiere. Вам надо сделать из нормального видео, с полями, картинку меньшего размера (picture in picture эффект). Видео ВСЕГДА, ВО ВСЕХ КАРТАХ ЗАХВАТА, хранится покадрово. Вы можете указать программе, что эти кадры состоят из а)единой картинки б)полей с более ранним полем из четных строк в) полей с более ранним полем из НЕчетных строк. Программа должна с этим уметь обращаться.

Если вы укажете No fields, Premiere возьмет ваш кадр с расческой и сделает ей resize с интерполяцией. Получится та же ерунда, что и с тюнерами. Кто виноват? - Вы сами. Программа сделала все верно, а вот ваш выбор был неправильным. Вы указываете правильный порядок следования полей во времени. Вот теперь вопрос- чего же делать? Можно выкинуть одно поле нафиг, а второе изменить в размере и выкинуть на весь кадр. Расчески не будет, но и плавности движений тоже. А если их не выкидывать?

Тогда, надо аккуратненько взять одно поле размером 720x288, (да, именно такую картинку надо выдернуть из кадра), изменить его размер до нужного на выходе, и пока отложить. Сделать тоже самое с вторым полем. Потом, синтезировать КАДР, в котором четные строки _этого кадра_ пойдут из одной картинки, а нечетные из другой. Работы заметно больше, два resize, один выбор строк, но зато все на выходе и двигается плавно, и строки из разных полей не перемешиваются. КАК это все перенести на тюнеры? Очень просто - из поля надо сделать полный кадр, сразу как оно придет в буфер, а потом тут же выплюнуть его на экран. Целиком. Затем сделать то же самое из второго поля. Получится кино из 50 кадров. Не всякая видеокарточка такое сможет, но большинство современных - ДА. Я так делал. Это ведь просто игровой режим, типичный, 50 fps.

Итого, нужна быстрая карта, и процессор, чтобы хорошо интерполировать 768х288 bitmap в 768x576, или ЛЮБОЙ другой. Все, больше ничего не надо. Вот только на такую операцию пойдут ценные такты процессора, а это никто не решается сделать, особенно при проигрывании DVD. Вот и извращаются с deinterlacing, вместо честного пути.

Чтобы всю картинку показать, надо 44 МБ/сек по видео шине пересылать. Ну и готовить такой поток из вдвое меньшего (16 бит на пиксел в нормальном режиме YUV2 - 22 МБ/сек против 44 для моего примера). Остальное (вроде растягивания на весь или на часть экрана) сама карточка сделает. Поток данных превышать не хотят, вот и расческа. Программно так сделать можно, но и в самом деле долго делать. Но играет нормально, я проверял на 50 ГЦ мпегах - видеокарта и процессор 450 справляются.

Комментарии