Что такое опция "sameq" или "same_quant" в FFmpeg? Означает ли это "то же качество"?

Что такое опция "sameq" или "same_quant" в FFmpeg? Означает ли это "то же качество"?

Часто я видел команды FFmpeg, использующие эту sameqопцию, например

ffmpeg -i input.mp4 -sameq output.avi

Что это значит? Означает ли это "то же качество"? Если нет, что мне следует использовать вместо этого?

решение1

sameqне означает «то же качество»

Несколько ресурсов в сети пропагандируют использование опции sameqor same_quant, но по сути они не правы. Использование sameqне дает вам результата того же качества, что и ввод.
Никогда не используйте его.

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

Вот что документация FFmpegсказал:

Обратите внимание, что это НЕ ТО ЖЕ КАЧЕСТВО. Не используйте эту опцию, если вы не уверены, что она вам нужна.

На самом деле разработчики FFmpeg имелиизменил имяот sameqдо same_quantпросто чтобы убедиться, а затемудаленный sameq/same_quantв целом; это означает, что эта опция отсутствует в последних версиях FFmpeg, но эта статья все равно будет полезна тем, кто использует старые сборки FFmpeg.


Как работает сжатие видео?

Теперь, когда мы прояснили этот вопрос, давайте перейдем к некоторым техническим деталям.

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

При кодировании видео ваши входные данные преобразуются в другое измерение, сначала применяя математическое преобразование к блокам пикселей. Это преобразование, в основномДискретное косинусное преобразование, создает матрицу чисел, описывающую, скажем, поле размером 8×8 пикселей в видео.

Итак, ваши 8×8 пикселей и соответствующая матрица изначально будут выглядеть так: 1

Исходное изображение  

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

Чтобы убрать цифры в правом нижнем углу, мы можем сделать их нулями. Если что-то является "ничем" или просто повторяется как 0s, нам не придется это хранить, и таким образом мы сэкономим место. Математически нам нужноквантоватьэту первую матрицу, применяя другую матрицу, «матрицу квантования».

В результате получится матрица, в которой теперь будет значительно меньше цифр и много нулей:

Сжатое изображение  

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

Здесь,матрица квантования определяет качество. Это важно. Мы можем использовать разные матрицы квантования для разного качества. Некоторые матрицы квантования оставляют исходную матрицу почти нетронутой, другие — нет. Чем больше чисел мы удаляем, темхудшийкачество будет, ноболеемы можем сжать видео, потому что мы можем здесь по сути «отбросить» нули.

С чем это связано sameq?

Предположим, вы кодируете видео и хотите задать определенное качество. Как мы уже узнали, разные матрицы квантования приводят к разному качеству, поэтому, когда мы говорим нашему кодеру использовать качество x, он выберет подходящую матрицу квантования, yчтобы получить это качество, каким бы оно ни было. Результатом является видео, сжатое с помощью матрицы y. 2

И вот что интересно:sameqозначает "тот же квантователь". А не "то же качество".Если у вас устаревшая версия FFmpeg, вы все равно можете найти ее здесь ffmpeg --help:

ffmpeg --help 2>&1 | grep sameq

Итак, когда вы теперь берете это преобразованное видео, кодируете его снова и применяете эту sameqопцию, FFmpeg, попросту говоря, выберет те же матрицы квантования, которые использовались для входного видео.

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

Оно делаетнетработать с разными видеокодеками вообще. Допустим, вы конвертируете видео, закодированное в XviD, с помощью x264. 4 Для этих двух кодеков матрицы квантования, используемые внутри, различны — у них разные коэффициенты. Так что эта опция даже не имеет смысла! К сожалению, FFmpeg все еще позволяет вам использовать ее.

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

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


1) Матрица здесь не соответствует изображению, на самом деле. Это просто пример.
2) На самом деле, в наши дни большинство процессов кодирования не просто используютодинматрица. Когда вы устанавливаете определенный битрейт, кодер будет использовать разные матрицы, чтобы получить средний битрейт в секунду. Аналогично, при установке определенного качества современные кодеры используют разные матрицы в зависимости от контента. Это связано с тем, что некоторые контенты «легче» сжимать, чем другие, и требуют меньшего квантования для получения того же коэффициента сжатия.
3) Пример: ffmpeg -i input.avi -sameq -c:v libxvid output.avi. Не используйте это. Пожалуйста.
4) Пример: ffmpeg -i input.avi -sameq -c:v libx264 output.mp4. Не используйте это тоже. Я серьезно.

Связанный контент