Как масштабировать видео, а затем наложить изображение с помощью ffmpeg?

843
amperial

Я использую сценарий веб-сайта, который был создан кем-то, кто, к сожалению, не оказывает никакой помощи по этому вопросу.

Вот кусок кода:

$com=$global_settings["ffmpeg_path"]." -i \"".$apath."\" -vcodec libx264 -strict -2 -t ".$duration." -vf 'movie=".$_SERVER["DOCUMENT_ROOT"].site_root."/content/watermark-video.png [wm];[in][wm] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]' -vf scale=498:-1 ".$flv_path; 

Он должен делать то, что мне нужно, что описано в заголовке этого поста, но это не так. Он масштабирует видео, но не применяет водяной знак png. Любая помощь будет оценена.

1

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

0
Rens

Используйте, filter_complexпотому что overlayфильтр использует более одного входа. Ваша общая командная строка будет выглядеть так:

ffmpeg -i <input> -filter_complex "movie=<path to png>[image],[0:v]scale=h:w[scaled],[scaled][image]overlay[out]" -vcodec libx264 -strict -2 -t <duration> -map [out] <outfile> 

Более конкретные для вашего случая:

if($global_settings["ffmpeg_watermark"]) { $com=$global_settings["ffmpeg_path"]." -i \"".$apath."\" -vcodec libx264 -strict -2 -t ".$duration." -filter_complex 'movie=".$_SERVER["DOCUMENT_ROOT"].site_root."/content/water‌​‌​mark-video.png [wm];[0:v]scale=498:-1[scaled];[scaled][wm] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]' -map [out] " .$flv_path; } else { $com=$global_settings["ffmpeg_path"]." -i \"".$apath."\" -vcodec libx264 -strict -2 -t ".$duration." ".$flv_path; } exec($com); 
На самом деле, это правильный форум для вопросов о ffmpeg. И причина, по которой команда OP не работает, состоит в том, что вторая `vf` переопределяет первую. Gyan 6 лет назад 0
Может ли кто-нибудь показать мне, как реализовать правильную команду в моем коде: if ($ global_settings ["ffmpeg_watermark"]) {$ com = $ global_settings ["ffmpeg_path"]. "-I \" ". $ apath. "\" -vcodec libx264 -strict -2 -t ". $ duration." -vf 'movie = ". $ _ SERVER [" DOCUMENT_ROOT "]. site_root." / content / water‌ mark-video.png [wm ]; [in] [wm] overlay = (main_w-overlay_w) / 2: (main_h-overlay_h) / 2 [out] '-vf scale = 498: -1 ". $ flv_path; } else {$ com = $ global_settings ["ffmpeg_path"]. "-i \" ". $ apath." \ "-vcodec libx264 -strict -2 -t". $ duration. "". $ flv_path; }} exec ($ com); amperial 6 лет назад 0
Обновленный ответ был более конкретным для вашего случая. Rens 6 лет назад 0
@Rens Спасибо! Позвольте мне попробовать, и я вернусь с результатом ... amperial 6 лет назад 0
@Rens Это работает! Спасибо вам большое! amperial 6 лет назад 0

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