组合 FFmpeg 过滤器的速度优势?
Speed advantage in combining FFmpeg filters?
我目前正在使用五个独立的 FFmpeg 进程来执行以下操作:
- trim & 裁剪视频 B
- 将视频 B 缩放到视频 A 的高度
- 合并视频 B 和视频 A
- 添加 fade-in/fade-out 到组合视频
- 添加叠加层以淡入淡出 in/out vid
我将它们都设置为超快,但它仍然需要很长时间 - 大约 40 秒,而每个视频的长度约为 10 秒。
我最初尝试组合一些过滤器,但无法在可用的时间范围内使用它。我也不确定花在弄清楚如何组合所有过滤器上的时间是否会在更快的处理时间内得到回报。
有任何 thoughts/insights 来自您杰出的 FFmpeg 专家吗?这会加快处理速度吗?如果是这样,我应该将所有命令组合在一起,还是应该将一些命令组合在一起而将其他命令分开?
这是我当前的命令,所有命令都有效:
// trimming 200ms off begining of vid B + cropping frame (note that I have previously retrieved dimensions and duration of both videos with ffprobe)
1. `ffmpeg -i vidB.mov -ss 200 -t ${vidB.duration} -async 1 -filter:v "crop=iw:${vidB.croppedHeight}:0:${vidB.offset}" -preset ultrafast -c:a copy croppedVidB.mov`
// scale Vid B up to Vid A's height
2. `ffmpeg -i croppedVidB.mov -vf scale=-2:${vidA.height} vidBScaled.mov`
// combine videos
3. `ffmpeg -i vidA.mov -i vidBScaled.mov -filter_complex "[0:v][1:v] hstack=inputs=2[v]; [0:a][1:a]amix[a]" -map "[v]" -map "[a]" -preset ultrafast -ac 2 combined.mov`
// add fade in & out
4. `ffmpeg -i combined.mov -sseof -1 -copyts -i combined.mov -filter_complex "[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v]; anullsrc,atrim=0:1[at];[0][at]acrossfade=d=1,afade=d=1[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset ultrafast -shortest fadeInOut.mov`
// add overlay
5. `ffmpeg -i fadeInOut.mov -i overlay.png -filter_complex overlay=W-w-10:H-h-10 -codec:a copy -preset ultrafast -async 1 overlay.mov`
提前感谢您的想法!
一条命令搞定一切:
ffmpeg -i vidA.mov -ss 200 -t ${vidB.duration} -i vidB.mov -i overlay.png -filter_complex "[1]crop=iw:${vidB.croppedHeight}:0:${vidB.offset},scale=-2:${vidA.height}[right];[0][right]hstack=inputs=2,fade=t=in:duration=1,fade=t=out:start_time=${vidB.duration - 1}:duration=1[bg];[bg][2]overlay=W-w-10:H-h-10:format=auto,format=yuv420p[v];[0:a][1:a]amix,afade=t=in:duration=1,afade=t=out:start_time=${vidB.duration - 1}:duration=1[a]" -map "[v]" -map "[a]" -c:v libx264 -preset ultrafast -c:a aac -ac 2 -movflags +faststart output.mp4
请注意 ${vidB.duration - 1}
:这是我用 bc
或类似方法显示您需要减去 1 秒的懒惰方法。
我目前正在使用五个独立的 FFmpeg 进程来执行以下操作:
- trim & 裁剪视频 B
- 将视频 B 缩放到视频 A 的高度
- 合并视频 B 和视频 A
- 添加 fade-in/fade-out 到组合视频
- 添加叠加层以淡入淡出 in/out vid
我将它们都设置为超快,但它仍然需要很长时间 - 大约 40 秒,而每个视频的长度约为 10 秒。
我最初尝试组合一些过滤器,但无法在可用的时间范围内使用它。我也不确定花在弄清楚如何组合所有过滤器上的时间是否会在更快的处理时间内得到回报。
有任何 thoughts/insights 来自您杰出的 FFmpeg 专家吗?这会加快处理速度吗?如果是这样,我应该将所有命令组合在一起,还是应该将一些命令组合在一起而将其他命令分开?
这是我当前的命令,所有命令都有效:
// trimming 200ms off begining of vid B + cropping frame (note that I have previously retrieved dimensions and duration of both videos with ffprobe)
1. `ffmpeg -i vidB.mov -ss 200 -t ${vidB.duration} -async 1 -filter:v "crop=iw:${vidB.croppedHeight}:0:${vidB.offset}" -preset ultrafast -c:a copy croppedVidB.mov`
// scale Vid B up to Vid A's height
2. `ffmpeg -i croppedVidB.mov -vf scale=-2:${vidA.height} vidBScaled.mov`
// combine videos
3. `ffmpeg -i vidA.mov -i vidBScaled.mov -filter_complex "[0:v][1:v] hstack=inputs=2[v]; [0:a][1:a]amix[a]" -map "[v]" -map "[a]" -preset ultrafast -ac 2 combined.mov`
// add fade in & out
4. `ffmpeg -i combined.mov -sseof -1 -copyts -i combined.mov -filter_complex "[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v]; anullsrc,atrim=0:1[at];[0][at]acrossfade=d=1,afade=d=1[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset ultrafast -shortest fadeInOut.mov`
// add overlay
5. `ffmpeg -i fadeInOut.mov -i overlay.png -filter_complex overlay=W-w-10:H-h-10 -codec:a copy -preset ultrafast -async 1 overlay.mov`
提前感谢您的想法!
一条命令搞定一切:
ffmpeg -i vidA.mov -ss 200 -t ${vidB.duration} -i vidB.mov -i overlay.png -filter_complex "[1]crop=iw:${vidB.croppedHeight}:0:${vidB.offset},scale=-2:${vidA.height}[right];[0][right]hstack=inputs=2,fade=t=in:duration=1,fade=t=out:start_time=${vidB.duration - 1}:duration=1[bg];[bg][2]overlay=W-w-10:H-h-10:format=auto,format=yuv420p[v];[0:a][1:a]amix,afade=t=in:duration=1,afade=t=out:start_time=${vidB.duration - 1}:duration=1[a]" -map "[v]" -map "[a]" -c:v libx264 -preset ultrafast -c:a aac -ac 2 -movflags +faststart output.mp4
请注意 ${vidB.duration - 1}
:这是我用 bc
或类似方法显示您需要减去 1 秒的懒惰方法。