28

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

ffmpeg -i input.mp4 -sameq output.avi

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

1 ответ1

57

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

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

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

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

Обратите внимание, что это не то же самое качество. Не используйте эту опцию, если вы не уверены, что она вам нужна.

Фактически, разработчики FFmpeg изменили имя с sameq на same_quant просто для уверенности, а затем полностью удалили sameq/same_quant ; Это означает, что эта опция не существует в недавнем FFmpeg, но эта статья по-прежнему полезна для тех, кто использует более ранние сборки FFmpeg.


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

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

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

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

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

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

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

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

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

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

В результате мы превратили первую высококачественную матрицу с большим количеством чисел в матрицу, которая по-прежнему напоминает те же 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 . Не используйте это тоже. Я серьезно.

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