возможно ли частичное редактирование каждого кадра видео (например, добавление логотипа) без транскодирования? И сохранить видео в том же формате?

Я имею в виду, позиции пикселей каждого кадра рассчитываются; так возможно ли изменить байты файла таким образом, чтобы они приводили к желаемому изменению кадра (например, добавление логотипа)?

Я знаю, что в таких форматах, как XviD, это невозможно (по крайней мере, легко), но это совершенно невозможно или возможно для некоторых форматов (например, MPG или необработанный AVI)?

3 ответа3

5

Это возможно только (практически) для кодирования видео без потерь.

Без потерь без потерь

Это очень просто сделать то, что вы хотите для кодеков видео без потерь. Многие из них хранят видеоданные попиксельно, в основном в цветовом пространстве YUV. Также каждый кадр стоит сам по себе.

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

Так, например, если у вас есть необработанное видео YUV в контейнере AVI, вы можете редактировать его по кадрам и снова сохранять его в YUV в AVI.

Сохранение кодировки с потерями

Но если вы хотите выполнить кодирование видео с потерями - или сохранить исходное кодирование с потерями - после этапа редактирования, это невозможно. С этим связаны две проблемы: сам процесс кодирования и тот факт, что часто кадры зависят друг от друга.

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

Этот шаг заключается в том, что он принимает блок, скажем, 8 × 8 пикселей и преобразует его в блок частотных коэффициентов. Из этого блока отбрасываются определенные коэффициенты, что уменьшает объем информации (и, следовательно, сжимает размер), но также отбрасывает визуальную информацию, что снижает качество видео. Какие коэффициенты отбрасываются, зависит от настройки качества кодера. Видео тогда сохраняется не в пикселях, а в виде частотных коэффициентов.

Когда вы хотите отредактировать видео с потерями, вы сначала должны восстановить частотные коэффициенты в попиксельное представление снова (как упомянуто выше). На этом этапе вы можете отредактировать видео и вставить логотип, но как только вы захотите сохранить его снова, вам придется снова выполнить шаг преобразования - и выбросить информацию. Это, по сути, главная причина потери поколения.

Другая проблема заключается в том, что для большинства видео с потерями некоторые кадры зависят от информации, содержащейся в других кадрах. Более конкретно, B- и P-кадры содержат только смещения более ранних (или более поздних) B/P или I-кадров. Если вы изменили содержимое I-кадра, все другие зависимые кадры будут меняться при декодировании, что обычно не то, что вы хотите. Ответ Питера Кордеса ниже подчеркивает этот момент. И действительно, он прав, что в принципе вы можете редактировать видео с потерями в I-кадре на месте, но это будет практически очень трудно сделать.

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

2

slhck верен, если мы говорим о сложных видеокодеках с векторами движения (правка: фактически, любой вид внутреннего или внешнего предсказания). Вы можете изменить поток h.264, перекодировав только макроблоки в области, которую вы хотите заменить своим логотипом. Логотип в I кадрах, пропустить блоки в P и B кадрах. Но каждый раз, когда камера панорамировала, рядом находились блоки, которые получали свои данные изображения, копируя часть изображения, которая теперь имеет логотип. Таким образом, края вашего логотипа будут скопированы вокруг, повреждая другие части изображения до следующего кадра.

Так что он прав, но это из-за ссылок, а не из-за потерь. (редактировать: его правки проясняют большую часть путаницы.)

Для более простых кодеков, где каждый блок является независимым (даже не с каким-либо внутренним предсказанием), например, mjpeg, вы можете заменить кодированные блоки только в той области, которую вы хотите пометить логотипом, без декодирования / перекодирования остальной части изображения. Я думаю, что есть поддержка для этого в одном файле изображения jpeg, но IDK, если что-то поддерживает его для mjpeg, не разбивая фреймы на отдельные файлы jpeg.

http://jpegclub.org/jpegjoin/jpegjoin.txt содержит информацию о том, как использовать jpegtran для замены некоторых блоков файлов jpeg без декодирования / кодирования остальной части изображения.

Вот пример возни с видео потоком без декодирования / перекодирования. Сокрытие данных в потоке h.264, в низких коэффициентах макроблоков iPCM. (буквальное, не DCTed, кодирование.) Вы должны декодировать / перекодировать слой энтропийного кодирования CABAC. (Это последнее сжатие в стиле zip для потока битов.)

Если источник находится в формате без потерь, вы не несете огромных затрат на размер файла, распаковывая, редактируя и сжимая все это, только CPU. Многие форматы без потерь, по сути, упаковывают каждый кадр целиком, а не работают с блоками, поэтому вам придется выполнять полное распаковывание-редактирование-повторное сжатие. H.264 без потерь имеет все внутреннее и внутреннее предсказание нормального h.264 с потерями, поэтому, несмотря на то, что он имеет макроблоки, там также требуется полное декодирование-редактирование-кодирование.

Ничто из этого не меняет ничего для реальной практической цели создания логотипа видео, ЕСЛИ БЕЗ вашего источника с потерями был mjpeg. Я просто пишу это для тех, кому интересно, почему.

1

Я бы сказал, что это должно быть возможно.

Во время перехода США на OTA HD (ATSC) почти все сети передавали видео из своих домашних студий через спутник, используя видеопоток с очень высокой скоростью передачи данных (намного выше, чем скорость передачи данных OTA). Затем они предоставили каждой местной телевизионной станции декодер и кодер с более низкой скоростью передачи битов, чтобы они могли полностью декодировать высококачественный поток, добавить логотип своей станции, вставки изображений и т.д., А затем кодировать для передачи в стандартном битрейте вещания.

Однако сеть Fox решила кодировать поток в своих домашних студиях, предположительно, используя кодер более высокого качества (и затрат), но с широковещательной скоростью передачи. Затем они предоставили « сплайсер » каждому локальному филиалу, который мог частично декодировать поток, вставлять логотипы, сканировать и т.д., А затем перекодировать только эту часть перед трансляцией.

Я понимаю, что поток MPEG-2, используемый в ОТА-трансляции, отличается от h.264/MPEG-4, но из того, что я знаю о технических деталях форматов, это, скорее всего, все еще возможно с h.264/MPEG-4. , (На самом деле, MPEG-4 на самом деле добавляет функции, которые поддерживают альфа-композитинг, хотя я подозреваю, что немногие декодеры могут на самом деле обрабатывать эту функцию.)

Тем не менее, поиск такого программного обеспечения ускользнул от меня. У меня есть потоки, к которым я хотел бы добавить графическую панель (в основном, спортивные результаты), без перекодирования и без того посредственного качества с дешевой камеры. Но я еще не нашел.

Редактировать: я нашел эту статью на тему « Замена областей изображения в битовом потоке H.264/AVC с использованием независимых срезов », которая, как представляется, предоставляет технические детали для достижения этой цели. Но я все еще ищу какое-то проверочное программное обеспечение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .