ffmpeg - Как скопировать | Извлечь настройки кодировки из существующего медиа-файла?

19

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

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

Как я могу извлечь эти настройки из существующего файла, чтобы использовать их (напрямую) для кодирования с помощью ffmpeg?

Например, я получил mkvвидео, закодированное x264с некоторыми настройками, и другой несжатый aviфайл. Я хотел бы «скопировать» настройки кодирования, используемые для файла x264 mkv, для перекодирования avi с теми же настройками.

Примечание: я ищу способ, который не должен включать человеческую работу с «переводом» настроек из декодера в кодировщик. Это нормально, если мне нужно сначала извлечь настройки и сохранить их где-нибудь, но я хотел бы иметь возможность просто передать параметры чтения в командную строку или файл предварительной настройки | для ffmpeg.

n611x007
источник
Ну, вы могли бы , вероятно , своего родом через выход ffprobe(особенно с -show_streamsи -show_formatвариантами) и использовать эту информацию для сценария важных вещей
evilsoup
1
Часто использование одних и тех же настроек, таких как битрейт (попытка скопировать точный битрейт, кажется, популярным среди пользователей), не приведет к оптимальному качеству. Конечно, я понятия не имею, на что похож ваш типичный ввод, но с x264 -crfобычно рекомендуется использовать эту опцию. См. Руководство по кодированию FFmpeg и x264 .
llogan
Я не могу найти ничего о настройках кодирования в выводе ffprobe :(
thelolcat
Он показывает только количество ReFrames, но не другие настройки, как mediainfo
thelolcat
Входной синтаксис с ffmpeg отличается от полей метаданных. Например, вы можете прочитать channels:6видеофайл, но для его кодирования вам понадобится переключатель -ch:6. Некоторые коммутаторы используют одну букву, некоторые используют две и т. Д.
jiggunjer

Ответы:

10

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

В большинстве случаев это будут следующие:

  • Формат контейнера (MP4, MKV,…)
  • Видео и аудио кодек (H.264, H.265,…)
  • Аудио-конкретно:
    • Количество аудиоканалов
    • Частота дискретизации звука
    • Аудио битрейт
  • Видео-конкретно:
    • Профиль и уровень (для обеспечения совместимости см. Здесь )
    • Максимальные битрейты (например, для H.264 )
    • Максимальное разрешение видео, изменить с помощью -filter:v scaleили-s:v
    • Частота кадров, изменить через -filter:v fps -r
    • Chroma subampling, изменение через -pix_fmt(например, -pix_fmt yuv420pдолжно дать вам лучшую совместимость)
    • Размер GOP (расстояние между кадрами IDR), устанавливается через -g
    • Другие конкретные настройки кодирования

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


Что касается конкретной задачи использования x264, это не будет тривиальным. Я не знаю ни одного скрипта, который бы позаботился об этих задачах, которые обычно выполняются вручную. Для получения большей информации о настройках кодирования в Unix / Linux или OS X вы можете использовать mediainfoнекоторые приемы Bash.

Например, для видео в кодировке x264 в файле MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Это выведет список параметров x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Затем вы можете вручную передать эти параметры в двоичный файл x264.

Если вы пройдете через FFmpeg, это немного сложнее, поскольку не все параметры x264 могут или должны отображаться таким образом. Обратите внимание, что часто подойдет и простая предустановка, настройка и спецификация профиля (как видно x264 --fullhelpиз руководства по кодированию x264 ), и достаточно указать уровень CRF.

И это даже не касается аудио, где, к счастью, вариантов не так много.

slhck
источник
Так что это невозможно с ffprobe или ffmpeg?
thelolcat
Нет, это невозможно сделать напрямую с помощью ffprobe / ffmpeg. В случае видео в кодировке x264 я бы использовал mediainfoвывод и сопоставил бы эти параметры с ffmpeg -x264-params. (См. Также руководство по кодированию x264 ). Но если вам нужно общее решение для всех видов кодеков / кодировщиков или контейнерных форматов, вам нужно написать умеренно сложный скрипт, который выполняет преобразование.
slhck