Кодирование видео — пустая трата места

Я столкнулся с распространенной проблемой, которую не могу подобрать для описания: у меня есть несколько рипов VHS низкого качества, которые были закодированы с помощью определенного кодека Apple ProRes (не имеет значения в контексте этого конкретного вопроса) и занимают несколько ГБ места. Я точно знаю, что видеоконтент настолько низкого качества, что он не должен занимать больше места, чем, скажем, файл XDCAM EX 1080 HD большей длины и более высокого визуального качества.

Точно так же как возможно, что один видеофайл может стать в десять раз больше без какого-либо выигрыша в точности при кодировании кодеком без потерь или с более высоким битрейтом? Я предполагаю, что кодировщик каким-то образом добавляет «дополнительную» информацию при повторном кодировании... но очевидно, что файл с низкой точностью не может улучшить качество, когда он просто перекодируется с более высокими настройками качества... так что же? происходит здесь?

Есть ли слово, чтобы описать это явление? Кроме того, как я могу убедиться, что мое перекодирование не УВЕЛИЧИВАЕТ размер файла? Я искал инструменты, которые могут измерять соответствующий битрейт для файлов (например, низкокачественные рипы VHS, которые каким-то образом могут занимать до 10 ГБ ... чего не должно происходить), но я не могу найти подобных инструментов. .. Что я хочу сделать в этой ситуации, так это перекодировать эти массивные файлы в соответствующий формат с разумным размером файла без потери видимого качества...

Ответы (3)

Это не явление, это сжатие. Это просто то, как это работает.

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

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

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

Если бы вместо этого вы использовали сжатие с потерями, которое было бы «похожим» на уровень качества видео, вы бы добавили еще больше плохих артефактов и потеряли бы любое подобие фактического сигнала, оставшегося в видео.

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

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

DV-видео производственного качества использовало гигабайт или более хранилища каждые 4,7 минуты или около того, поэтому совершенно неудивительно, что ваш высококачественный SD-захват (даже если сам источник был дерьмовым) «большой» по потребительским стандартам. Если вам не нужно редактировать видео, совершенно нормально перекодировать их как готовые видео в размер файла потребления с низкой скоростью передачи данных. Я бы порекомендовал использовать для этой цели двухпроходное кодирование VBR, h.264 должен работать нормально, и вы можете использовать низкий битрейт.

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

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

Поколения потерь — это термин, который я искал. Иногда я забываю, что сжатие настолько сложно, как кажется, поэтому, думаю, мне придется просто поиграть с настройками, пока я не найду некоторые настройки, которые будут работать для архивирования рипов VHS. Спасибо! Это был сложный вопрос. Другой ответ был действительно хорош тем, что давал простую для понимания информацию о том, как работает сжатие видео.

Чтобы понять это, вам нужно понять, как на самом деле работают кодеки. Простой несжатый видеокадр, например, одно изображение довольно большое. Я говорю о растровом изображении, а не о видео, закодированном без потерь, вообще без кодирования, просто о пиксельной информации.

Вот простой пример кадра Full HD для некоторого ракурса: У нас есть разрешение 1920x1080, равное 2073600пикселям. Теперь каждый пиксель имеет три значения цвета. Обычно это 8-битное значение для каждого цвета (хотя оно также может быть 10/12/16 или 32-битным). Итак, у нас есть 2073600*3*8что равно 49766400 bits. Чтобы получить байты, мы должны разделить на 8, и мы получим 6220800 байт или 5,93 МБ. Так что это почти 6 МБ на кадр, для видео с частотой 30 кадров в секунду это 178 МБ в секунду ! 10-минутное видео заняло бы безумные 104 ГБ.

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

Поэтому, когда вы записываете свой VHS, устройство захвата получает каждый кадр в виде растрового изображения, которое оно будет кодировать так, как вы ему скажете. Таким образом, даже несмотря на то, что VHS использует аналоговое сжатие и имеет общее плохое качество, вы все равно получаете тот же фрагмент информации, что и на Blu-ray, закодированном с тем же разрешением и битовой глубиной , что и ваше устройство захвата записывает ваш VHS. «Хорошее качество» определяется только вашим восприятием картинки.

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

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

Это так называемые кодеки с потерями, такие как h264. Это еще более умный и сложный алгоритм, в котором кадр больше не просто кадр, кодировщик просматривает несколько кадров и пытается оценить, как кадры между так называемыми « ключевыми кадрами » будут выглядеть на основе информации в этих ключевых кадрах. Также они разбивают изображение на несколько блоков информации и пытаются «угадать», как они должны выглядеть. Поскольку мы знаем, как мы угадываем информацию, нам просто нужна «подсказка», поэтому, когда мы декодируем наш кадр, мы можем довольно точно предположить, как выглядел бы этот фрагмент информации, но это не 100% точное представление исходной информации.

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

Это также причина, по которой у нас была эта блокировка в сильно сжатых видео, закодированных MPEG2, еще на заре Интернета, h.264 обрабатывает это намного умнее, поэтому у нас больше нет артефактов такого типа, но мы получаем эти странные искажения иногда возникают, когда изображение размазывается таким «блочным образом», что происходит, когда возникает ошибка декодирования, и мы пропустили ключевой кадр для декодирования кадров между следующим ключевым кадром.

Чтобы ответить на ваш последний бит. MP4 с видео в кодировке h264, как правило, хорошая идея. Используйте такой инструмент, как Handbrake , он очень упрощает задачу, и вы по-прежнему можете контролировать результат. Либо выберите предустановку, либо установите для параметра «RF» значение 18, чтобы получить видео без визуальных потерь. Это означает, что вы не увидите визуальной разницы в качестве.

Для точного или почти точного воспроизведения входных пикселей требуется много битов, независимо от того, что они содержат. Единственным исключением являются несложные вещи, такие как снимок экрана или анимация, где большие области имеют ТОЧНО один и тот же цвет и/или побитно идентичны от кадра к кадру.

Разница между вашей интуицией и реальной жизнью заключается в том, что кодеки работают со сложностью, измеряемой компьютером, а не с воспринимаемой человеком визуальной сложностью/качеством.

Сжатие шума — это то, куда идут все биты. Обход кодека с потерями в оба конца фактически уменьшит сжимаемость анимации, потому что затем вводятся артефакты размытия и особенно блокировки, которые вы просите воспроизвести следующий кодек.

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

Все, что у нас есть сейчас, это грубые приближения, которые пытаются угадать, что важно сохранить, на основе коэффициентов DCT или вейвлетов и подобных мер. (например, высокая энергия в более высоких коэффициентах означает, что здесь, вероятно, есть некоторые края, поэтому было бы хуже, чем обычно, исказить этот блок изображения 16x16 пикселей).