FFMPEG 修剪视频(使用选择)不会影响整体时长

FFMPEG 修剪视频(使用选择)不会影响整体时长

我对使用 FFMPEG 非常陌生,我想要实现的是在特定位置和时间应用叠加图形,并剪切出单个输入视频的各个部分。

我已经计算出了叠加图形,因此此代码可以运行:

ffmpeg -i /Users/username/projectdir/static/video.mp4 -I overlay.png -i overlay2.png -filter_complex "[0:v][1:v] overlay=192:108:enable='between(t, 0, 5)'[ov0]; [ov0] overlay=192:108:enable='between(t, 5, 10)'" -pix_fmt yuv420p output_overlayed.mp4

但是当我尝试使用此代码剪切部分时:

ffmpeg -i /Users/username/projectdir/static/video.mp4 -I overlay.png -i overlay2.png -filter_complex "[0:v][1:v] overlay=192:108:enable='between(t, 0, 5)'[ov0]; [ov0] overlay=192:108:enable='between(t, 5, 10)', select='between(t,0,5)+between(t,10,15)', setpts='N/FRAME_RATE/TB'" -pix_fmt yuv420p output_overlayed_trimmed.mp4

似乎剪辑得当,所以原始视频从 0 秒开始播放到 5 秒,然后从 10 秒播放到 15 秒并剪辑。但在视频剪辑之后,视频播放期间屏幕全黑。我似乎无法让它工作,所以它影响了视频的整体时长。

(顺便说一下,传入的值只是示例,例如,我让它在 5 秒内开始覆盖,但也在 5 秒内切断)

我有叠加层应在未修剪的视频上出现的时间戳,因此应该先进行叠加,然后再进行修剪。如果先修剪视频,则叠加层会出现在错误的时间。

目前正在实现此目的的另一种方法是执行第一行代码(仅生成一个带有覆盖的新视频文件),然后单独获取这个新文件并独立执行修剪:

ffmpeg -ss 0 -to 5 -i /Users/username/projectdir/static/output_overlayed.mp4 -ss 15 -to 20 -i /Users/username/projectdir/static/output_overlayed.mp4 -filter_complex "[0][1]concat=n=2:v=1:a=1" output_trimmed.mp4

但这意味着要处理 2 个单独的文件,然后在第二次执行完成后必须删除第一个文件。理想情况下,我会将它们合并为一个不会产生多个文件的命令。

非常感激任何帮助-谢谢!

答案1

假设video.mp4有一个音频流,结果的长度与音频流的长度匹配。

  • 添加用于选择音频流相关部分的过滤器aselectasetpts
    [0:a]aselect='between(t,0,5)+between(t,10,15)',asetpts='N/SAMPLE_RATE/TB'
  • 因为有两个流,我们可以给视频流临时名称[v],给音频流临时名称[a],并应用流映射:-map "[v]" -map "[a]"

更新的命令:
ffmpeg -y -i video.mp4 -i overlay.png -i overlay2.png -filter_complex "[0:v][1:v]overlay=192:108:enable='between(t,0,5)'[ov0];[ov0][2:v] overlay=192:108:enable='between(t,5,10)',select='between(t,0,5)+between(t,10,15)',setpts='N/FRAME_RATE/TB'[v]; [0:a]aselect='between(t,0,5)+between(t,10,15)',asetpts='N/SAMPLE_RATE/TB'[a]" -shortest -map "[v]" -map "[a]" -pix_fmt yuv420p output_overlayed_trimmed.mp4


测试:

使用 FFmpeg 构建输入视频和图像:

ffmpeg -y -f lavfi -i testsrc=size=384x216:rate=25 -f lavfi -i sine=frequency=400 -t 30 video.mp4
ffmpeg -y -f lavfi -i mandelbrot=size=192x108 -v:frames 1 overlay.png
ffmpeg -y -f lavfi -i color=blue:size=192x108 -v:frames 1 overlay2.png

使用上述输入执行“更新的命令”。


输出视频的总长度为10 秒

第一帧:
在此处输入图片描述

在很短的时间内,我们看到了蓝色overlay2.png覆盖:
在此处输入图片描述

最后的示例框架:
在此处输入图片描述

相关内容