分屏输入视频转循环单屏视频的实现方法咨询
分屏输入视频转循环单屏视频的实现方法咨询
嘿,这个需求用FFmpeg就能轻松搞定!我来给你一步步拆解怎么做,不管你是双分屏还是多分屏,自定义每屏显示时长都没问题:
核心思路
先把分屏视频的每个区域单独截取出来,再按你想要的时长(1秒、2秒都可以)交替拼接这些区域的画面,循环覆盖原视频的全部时长。
具体操作(以双分屏为例,3840x2160左右分屏)
假设你要每1秒切换一次左右屏,直接用下面的FFmpeg命令就行,不用生成中间文件:
ffmpeg -i input.mp4 -filter_complex " split=2[v0][v1]; # 截取左半屏(宽1920,高2160,起始坐标x=0,y=0),只保留偶数秒的画面 [v0]crop=1920:2160:0:0,select='mod(n,60)<30',setpts=N/FRAME_RATE/TB[left]; # 截取右半屏(起始坐标x=1920,y=0),只保留奇数秒的画面 [v1]crop=1920:2160:1920:0,select='mod(n,60)>=30',setpts=N/FRAME_RATE/TB[right]; # 拼接左右屏的片段,生成最终视频流 [left][right]concat=n=2:v=1:a=0[v]; # 同步音频时间戳,避免音画错位 [a]asetpts=N/SR/TB[aout] " -map "[v]" -map "[aout]" -c:v libx264 -crf 23 -preset medium output.mp4
参数自定义调整指南
- 切换时长修改:如果想每2秒切换一次,把
mod(n,60)里的60改成120(假设视频帧率是30fps,2秒对应60帧,切换周期就是120帧),同时把<30改成<60,>=30改成>=60即可。如果你的视频帧率不是30,替换成帧率×2×单屏时长和帧率×单屏时长就好。 - 多分屏适配:如果是4分屏(2×2布局),先把
split=2改成split=4,然后给每个流加对应的crop命令(比如左上屏crop=1920:1080:0:0,右上屏crop=1920:1080:1920:0等),再给每个流设置对应的select过滤条件,最后把concat=n=2改成concat=n=4。 - 上下分屏适配:如果是上下布局的分屏,调整
crop参数即可——上半屏是crop=3840:1080:0:0,下半屏是crop=3840:1080:0:1080。 - 视频质量控制:
-crf 23是默认质量,数值越小质量越高(18-28是常用范围);-preset medium是编码速度,可选fast(更快)或slow(画质更优)。
小提示
用帧计数(mod(n,xxx))比时间(mod(t,xxx))更精准,能避免浮点运算导致的切换时机误差,优先推荐这种写法。
备注:内容来源于stack exchange,提问作者PirateApp
相关产品推荐
相关产品推荐

