ffmpeg — поддержание качества видео при применении многоходового рабочего процесса, каждый из которых снова включает декодирование и кодирование при редактировании видео

#video #ffmpeg #video-codecs

#Видео #ffmpeg #видеокодеки

Вопрос:

Я использую библиотеки FFMPEG, которые выполняют некоторые манипуляции с видео, и из-за сложности фильтров и наложения изображений мне приходится запускать процесс в несколько проходов. Это означает, что мой процесс таков: откройте исходное видео, декодируйте его, запустите -complex_filter, повторно сожмите видео в том формате, в котором было закодировано исходное видео. Откройте вывод с первого прохода, запустите другой -complex_filter и т. Д. И т. Д. Иногда мне приходится делать это 3-4 раза. Меня беспокоит то, что видео при каждом сжатии теряет качество — очевидными признаками этого является уменьшение размера файла с каждым проходом.

В связи с вышесказанным у меня есть два вопроса:

  1. Имеет ли смысл после первых манипуляций вместо сохранения видео в исходном формате выбрать какой-то формат без потерь, а затем выполнять мои проходы один за другим, зная, что качество остается неизменным, затем на последнем проходе я повторно сжимаю один раз в форматисточник. Если да, то какой формат видео вы бы порекомендовали? ProRes 4444? Любые другие форматы, которые я рассматриваю? Какие параметры я должен установить и перенести из кодирования в кодирование?

  2. С каждым шагом я переношу все дополнительные потоки аудио и других метаданных. Не было бы более эффективным удалять все, кроме видео, снова и снова запускать мои видео отрывки и не нужно добавлять -c: a copy и c: s copy ? Затем при последнем запуске объединить все потоки из исходного источника в выходной файл? Если да, то как конкретно я буду выполнять команду ffmpeg? У меня есть видео с 1 видеопотоком 15 аудиопотоков несколько дополнительных tmcd, которые мой ffmpeg не может прочитать.

Спасибо.

Редактировать 1:

если входное видео имеет видеокодек = dvvideo, и если размеры видео равны 1280х1080, это означает, что видео не имеет типичных квадратных пикселей. Сначала мне нужно изменить размер видео, при этом я увеличиваю масштаб видео. Затем я могу запускать свои фильтры:

проход-1: -масштаб vf = 1920×1080 (этот шаг пропускается, если видео имеет нормальное соотношение x / y) проход-2: -filter_complex: который вызывает мой специальный фильтр, который добавляет некоторый проприетарный водяной знак к видео проход-3: -filter_complex: «0 overlay = 5:21:enable=’between(t, 2,3) between(t, 4,5) between (t, 6,8)'» (единственная цель — вставить значок.png в место, рядом с которым был размещен водяной знак на предыдущем шаге.) проход-4:-масштаб vf = 1280×1080 (этот шаг масштабирует видео обратно, если был выполнен проход-1)

Вероятно, я мог бы переписать свой код фильтра «C» в какой-то момент в будущем, чтобы учесть эту логику проверки на разрешение 1280×1080, а также вставить этот значок.png и сделать все это за один шаг, но на данный момент я подумал, что просто использую 2-шаговый процесс, если обычное видео,или 4 прохода, если требуется масштабирование, и используйте что-то вроде формата без потерь в качестве решения для временных файлов (я произвольно выбрал ProRes 4444 v5, но открыт для предложений), это должно минимизировать потери при повторном сжатии видео.

Шаги 1 и 4 являются условными и применимы только в том случае, если: если vcodec == ‘dvvideo’ и aspect_ratio <1.2: # соотношение 1280х1080 составляет около 1,16, я выполняю шаги 1-> 4. В противном случае только шаги 2 и 3:

Шаг 1:

 ffmpeg -i in.mov -vf scale=1920x1080 -map 0:v? -map 0:a? -map 0:s? -map_metadata 0 -b:v 115084915 -maxrate 115084915 -minrate 115084915 -c:v prores_ks -profile:v 5 -preset ultrafast -crf 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y step2.mov
  

Шаг 2:

 ffmpeg -i step2.mov -filter_complex " myFilter=enable='between(t,0,30)':x=15:y=25:size=95:etc-etc..." -map 0:v? -map 0:a? -map 0:s? -map_metadata 0 -b:v 115084915 -maxrate 115084915 -minrate 115084915 -c:v prores_ks -profile:v 5 -preset ultrafast -crf 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y step3.mov
  

Шаг 3:

 ffmpeg -i step3.mov -i icon.png -filter_complex "[0][1]overlay=15:20:enable='between(t,1,3.600) between(t,4,5.500) between(t,6,20)' " -map 0:v? -map 0:a? -map 0:s? -map_metadata 0 -b:v 115084915 -maxrate 115084915 -minrate 115084915 -c:v prores_ks -profile:v 5 -preset ultrafast -crf 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y step4.mov
  

Шаг 4:

 ffmpeg -i step4.mov -map 0:v? -vf scale=1280x1080 -map 0:a? -map 0:s? -c:v dvvideo -pix_fmt yuv422p -b:v 115084915 -maxrate 115084915 -minrate 115084915 -r 29.97 -top 1 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -vtag dvh6 -map_metadata 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y final-output.mov
  

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

Комментарии:

1. Почему нельзя выполнить всю фильтрацию за один проход?

2. Я не думаю, что смогу объединить несколько complex_filters . Я попробовал 2, и команда не удалась, сообщение об ошибке гласило, что у меня не может быть более 1 комплекса. — Первый фильтр для меня самый важный, он применяет манипуляции с видео, изменяя пиксели видео и выполняет интенсивную обработку. — мой второй фильтр добавляет простое наложение значков, буквально указывая на изображение пальца, чтобы привлечь внимание зрителя к той части, где видео было обработано. — Если есть способ объединить или, по крайней мере, добавить imageoverlay без использования complex_filter, это было бы для меня выигрышем. Пожалуйста, сообщите.

3. Вы должны иметь возможность использовать on instance of -filter_complex для выполнения всей фильтрации в одной команде. Предоставьте все ваши команды, и мы можем предоставить вам комбинированную версию.

4. @llogan, чтобы проиллюстрировать процесс: если vcodec = dvvideo, и если видео имеет разрешение 1280×1080, -> видео не имеет квадратных пикселей. Я изменяю размер перед запуском своих фильтров: pass-1: -масштаб vf = 1920×1080 (этот шаг пропускается, если видео имеет нормальное соотношение x / y) pass-2: -filter_complex: который вызывает мой специальный фильтр, который добавляет некоторый проприетарный водяной знак к видео pass-3: -filter_complex:»[0] [1] overlay = 5:21:enable=’между (t, 2,3) между (t, 4,5)'» (вставляет значок.png в месте, рядом с которым на предыдущем шаге был размещен водяной знак.) проход-4: условныймасштаб => 1280×1080 (если был выполнен проход-1)

5. @llogan, вопрос отредактирован, все после РЕДАКТИРОВАНИЯ 1 является новым. Спасибо, что изучили это для меня.