首页 > 解决方案 > 使用ffmpeg同时将图像序列转换为视频和叠加

问题描述

我想降低程序的计算复杂度以加快处理速度。但是,我不确定是否有任何方法可以将图像序列到视频过程结合到一个过程中?

我已经实现的东西是以这种方式连续的,1)图像序列被转换为视频 2)下一个覆盖的过程发生。

所有工作都按预期进行,完成第 1 次和第 2 次操作需要很长时间。因此,我正在寻找结合这两个操作。

第一次操作

"-y -f concat -safe 0 -i {0} -vsync vfr -vf \"fps={1},format=yuv420p\" {2}"

第一个代码

string cmd = String.Format("-y -f concat -safe 0 -i {0} -vsync vfr -vf \"fps={1},format=yuv420p\" {2}"
                    , frameList, frame_rate, output_file);

第二次手术

-y -i {0} -i {1} -max_muxing_queue_size 1024 -filter_complex \"{2}{3}\" {4} {5} -c:a copy {6}

第二代码

string setpts = String.Format("[1:v]setpts=PTS-{0}/TB[a];", 0);
//{0}:{1} position
string overlay = String.Format("[0:v][a]overlay={0}:{1}:enable=gte(t\\,{2}):eof_action=pass,format=yuv420p[out]", Program.FrameWidth - (480+25), 25, overlay_delay);
string map = "-map \"[out]\" -map 0:a?";
string pix_fmt = "";
string cmd = String.Format("-y -i {0} -i {1} -max_muxing_queue_size 1024 -filter_complex \"{2}{3}\" {4} {5} -c:a copy {6}"
    , output_file, video_path, setpts, overlay, map, pix_fmt, output_file.Replace(".mp4", "_overlay_cam.mp4"));

我很感激你的帮助。

标签: ffmpeg

解决方案


利用

string setpts = String.Format("[1:v]setpts=PTS-{0}/TB[a];", 0);
string fps = String.Format("[0:v]fps={0}[i];", frame_rate);
//{0}:{1} position
string overlay = String.Format("[i][a]overlay={0}:{1}:enable=gte(t\\,{2}):eof_action=pass,format=yuv420p[out]", Program.FrameWidth - (480+25), 25, overlay_delay);
string map = "-map \"[out]\" -map 0:a?";
string pix_fmt = "";


string cmd = String.Format("-y -f concat -safe 0 -i {0} -i {1} -filter_complex \"{2}{3}{4}\" {5} {6} -c:a copy -max_muxing_queue_size 1024 {7}"
    , frameList, video_path, fps, setpts, overlay, map, pix_fmt, output_file.Replace(".mp4", "_overlay_cam.mp4"));

fps 过滤器在用于叠加之前对图像执行。覆盖过滤器被调整为使用 fps 过滤器的输出。其余一切保持不变。


推荐阅读