Часто я видел команды FFmpeg, используя sameq
опцию, например
ffmpeg -i input.mp4 -sameq output.avi
Что это значит? Означает ли это "то же качество"? Если нет, что я должен использовать вместо этого?
источник
Часто я видел команды FFmpeg, используя sameq
опцию, например
ffmpeg -i input.mp4 -sameq output.avi
Что это значит? Означает ли это "то же качество"? Если нет, что я должен использовать вместо этого?
sameq
не означает "то же качество"Несколько ресурсов в Интернете рекламируют использование опции sameq
или same_quant
, но по сути они ошибочны. Использование sameq
не дает результат с тем же качеством, что и входные данные.
Не используйте его, никогда.
Источником путаницы была плохо написанная документация, которая подразумевала, что использование этой опции обеспечит то же качество. К счастью, опция была удалена.
Вот что сказано в документации FFmpeg :
Обратите внимание, что это не то же самое качество. Не используйте эту опцию, если вы не уверены, что она вам нужна.
На самом деле разработчики FFmpeg уже изменили название от sameq
до same_quant
просто чтобы убедиться, а затем удалены sameq
/same_quant
полностью; Это означает, что эта опция не существует в недавнем FFmpeg, но эта статья по-прежнему полезна для тех, кто использует более ранние сборки FFmpeg.
Теперь, когда мы это выяснили, давайте углубимся в некоторые технические детали.
Чтобы понять, почему он не работает надежно, нам нужно понять, что означает «качество» для обычного видеокодера и что влияет на качество. Почему одно видео выглядит лучше другого при сжатии с разной скоростью передачи данных? Что делает конверсию потерянной, и почему видео меньше, чем оригинал после кодирования?
Когда вы кодируете видео, ваши входные данные преобразуются в другое измерение, сначала применяя математическое преобразование к блокам пикселей. Это преобразование, в основном дискретное косинусное преобразование , создает матрицу чисел, которые описывают, скажем, поле размером 8 × 8 пикселей в видео.
Итак, ваши 8 × 8 пикселей и соответствующая матрица изначально будут выглядеть так: 1
Но это слишком много данных! Если мы хотим сжать видео, мы можем на самом деле избавиться от цифр в правом нижнем углу. Я не буду объяснять, почему это так, но давайте просто скажем, что числа в верхнем левом углу более важны при описании такого блока. Основная идея трансформации заключается в том, чтобы поместить важные вещи в верхнее левое положение.
Чтобы убрать числа в правом нижнем углу, мы можем сделать их нулями. Если что-то является «ничем» или просто повторяется как 0
s, нам не нужно его хранить, и таким образом мы сэкономим место. Математически нам нужно квантовать эту первую матрицу, применяя другую матрицу, «матрицу квантования».
Это приведет к матрице, которая теперь содержит значительно меньше чисел и множество нулей:
В результате мы превратили первую высококачественную матрицу с большим количеством чисел в матрицу, которая по-прежнему напоминает те же 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
. Не используйте это тоже. Я серьезно.
-sameq
опция устарела, а затем удалена из avconv