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

13163
n611x007

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

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

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

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

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

13
Ну, вы, вероятно, могли бы отсортировать вывод `ffprobe` (особенно с опциями` -show_streams` и `-show_format`) и использовать эту информацию для написания важных вещей evilsoup 11 лет назад 0
Часто использование одних и тех же настроек, таких как битрейт (попытка скопировать точный битрейт, кажется, популярным среди пользователей), не приведет к оптимальному качеству. Конечно, я понятия не имею, на что похож ваш типичный ввод, но с x264 обычно рекомендуется использовать параметр `-crf`. См. [Руководство по кодированию FFmpeg и x264] (https://ffmpeg.org/trac/ffmpeg/wiki/x264EncodingGuide). LordNeckbeard 11 лет назад 1
Я не могу найти ничего о настройках кодирования в выводе ffprobe :( thelolcat 8 лет назад 0
Он показывает только количество перекадров, но не другие настройки, как mediainfo thelolcat 8 лет назад 0
Входной синтаксис с ffmpeg отличается от полей метаданных. Например, вы можете прочитать `channel: 6` из видеофайла, но для его кодирования вам понадобится ключ` -ch: 6`. Некоторые переключатели используют одну букву, некоторые используют две и т. Д. jiggunjer 8 лет назад 0

1 ответ на вопрос

7
slhck

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

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

Так что это невозможно с ffprobe или ffmpeg? thelolcat 8 лет назад 0
Нет, это * невозможно * сделать напрямую с помощью ffprobe / ffmpeg. В случае видео в кодировке x264 я бы использовал вывод `mediainfo` и сопоставил бы эти параметры с ffmpeg с помощью` -x264-params`. (См. Также [руководство по кодированию x264] (https://trac.ffmpeg.org/wiki/Encode/H.264#Overwritingdefaultpresetsettings)). Но если вам нужно общее решение для всех видов кодеков / кодировщиков или контейнерных форматов, то вам нужно написать умеренно сложный скрипт, который выполняет преобразование. slhck 8 лет назад 0

Похожие вопросы