如何在 ffmpeg 中的这个 filter_complex 表达式中在每个视频前 15 秒开始?

如何在 ffmpeg 中的这个 filter_complex 表达式中在每个视频前 15 秒开始?

我有 4 个视频,基本上是 4 个人一起玩合作游戏。它从相同的场景开始,然后显示每个玩家的屏幕。

我尝试将它们合并成一个 4 x 4 的网格,让所有视频从一开始就保持同步(在所有过场动画中),而其余部分则继续播放

我必须拍下其中一个视频中的过场动画,然后搜索此图像以找到每个视频中的偏移量,从而将它们同步

ffmpeg
    -i v_nimble_guardian.mkv -i macko_nimble_guardian.mkv -i ghost_nimble_guardian.mp4 -i nano_nimble_guardian.mkv
    -filter_complex "
        nullsrc=size=1920x1080 [base];
        [0:v] trim=start_pts=59117,setpts=PTS-STARTPTS, scale=960x540 [upperleft];
        [1:v] trim=start_pts=60483,setpts=PTS-STARTPTS, scale=960x540 [upperright];
        [2:v] trim=start_pts=805117,setpts=PTS-STARTPTS, scale=960x540 [lowerleft];
        [3:v] trim=start_pts=48100,setpts=PTS-STARTPTS, scale=960x540 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=960 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=540 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=960:y=540[v]
    "
    -map "[v]" -map 1:a -c:v libx264 -shortest output.mkv

一切都完美同步,除了我希望每个视频在 start_pts 帧前 15 秒开始,我该如何指定?

比如我如何找到 trim=start_pts=some_value 其中(你明白了)

some_value = 59117 - 15 seconds
some_value = 805117 - 15 seconds...

答案1

用最简单的数学来计算:

new_start_pts = start_pts - ( framerate * 15 )

您可以使用以下方式获取帧速率:

ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate video.mp4 | cut -d "/" -f 1

相关内容