Ffmpeg concat 过滤器从不同的视频生成帧

Ffmpeg concat 过滤器从不同的视频生成帧

我有一个工作流程,我将几个视频提供给 ffmpeg,每个视频对应一个镜头,然后 ffmpeg 将它们连接起来以生成单个视频,以 25 fps 的速度隔行扫描。问题是,有时在输出视频上,镜头边框由每个镜头的半帧组成。例如,在镜头 A 和镜头 B 之间有一个由 A 的半幅图像和 B 的半幅图像组成的帧。这是我的命令

ffmpeg -i clip-1.mp4 -i clip-2.mp4 -i clip-3.mp4 -filter_complex [0:v]scale=(iw*sar)*min(1920/(iw*sar)\,1080/ih):ih*min(1920/(iw*sar)\,1080/ih):sws_flags=bicubic+accurate_rnd+full_chroma_inp+full_chroma_int:sws_dither=bayer,pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2,minterpolate='fps=50:mi_mode=dup',setsar=sar=1/1[v0];[0:a:0]channelsplit[a00][a01];[1:v]scale=(iw*sar)*min(1920/(iw*sar)\,1080/ih):ih*min(1920/(iw*sar)\,1080/ih):sws_flags=bicubic+accurate_rnd+full_chroma_inp+full_chroma_int:sws_dither=bayer,pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2,minterpolate='fps=50:mi_mode=dup',setsar=sar=1/1[v1];[1:a:0]channelsplit[a10][a11];[2:v]scale=(iw*sar)*min(1920/(iw*sar)\,1080/ih):ih*min(1920/(iw*sar)\,1080/ih):sws_flags=bicubic+accurate_rnd+full_chroma_inp+full_chroma_int:sws_dither=bayer,pad=1920:1080:(1920-iw*min(1920/iw\,1080/ih))/2:(1080-ih*min(1920/iw\,1080/ih))/2,minterpolate='fps=50:mi_mode=dup',setsar=sar=1/1[v2];[2:a:0]channelsplit[a20][a21];[v0][a00][a01][v1][a10][a11][v2][a20][a21]concat=n=3:v=1:a=2[out][a0][a1];[out]tinterlace=interleave_top:flags=low_pass_filter,setdar=dar=16/9,setsar=sar=1/1[vout] -map [vout] -map [a0] -map [a1] -c:a pcm_s16le -ar 48k -tune psnr -field_order tt -top 1 -flags +ildct+ilme -timecode 00:00:00:00 -c:v libx264 -s hd1080 -vsync vfr -r 25 -pix_fmt yuv422p10le -aspect 16:9 -x264opts videoformat=component:nal-hrd=cbr:videoformat=component:avcintra-class=100:interlaced:tff -max_muxing_queue_size 4096 -threads 0 -y output.mxf

有什么方法可以避免这种情况吗?

答案1

使用 concat 时,这个问题可能不可避免。如果您可以使用淡入淡出滤镜在两个滤镜之间过渡,请尝试使用淡入淡出滤镜。它可能会平滑伪影,但如果镜头太多,FFmpeg 命令可能会变得复杂。您必须编写一个脚本,在循环中构建滤镜选项,然后才能将其用作 ffmpeg 命令。

相关内容