ffmpeg 选择最短的电影但留下全长音频

Sta*_*mes 5 ffmpeg

我创建了一个工具来创建电影网格,就像在 Brady Bunch 的开头一样。这是一个很酷,有趣的效果。

这是显示网格的示例影片。

ffmpeg 输出中的电影网格

问题是,ffmpeg的是选择最短的影片,以确定的叠加视频最大长度,但依然采用了第一条音轨的长度来确定整体输出影片的长度。

因此,当最短的视频结束时,我所有的视频都停止移动,但音频会在第一部电影的全长播放。

如何 (1) 将输出电影的长度设置为最长的输入电影或 (2) 将音频长度也与最短的电影长度相匹配?

我的脚本的要点

基于这个 ffmpeg 示例用法,它表现出相同的音频问题:

ffmpeg
    -i 1.avi -i 2.avi -i 3.avi -i 4.avi
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
        [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
        [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
        [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=320:y=240
    "
    -c:v libx264 output.mkv
Run Code Online (Sandbox Code Playgroud)

llo*_*gan 5

如何将输出影片的长度设置为最长的输入影片?

从每个覆盖层中删除shortest=1。默认情况下,覆盖的最短输入将停止,并重复最后一帧,同时较长的输入继续。可以使用覆盖选项更改此行为eof_action。请参阅覆盖过滤器文档

如何将音频长度与最短的电影长度相匹配?

添加-shortest输出选项。这是与覆盖选项不同的选项shortest;将其作为输出选项放在过滤器图表之外(在输出文件之前)。现在,最终的输出文件将与最短的流具有相同的持续时间:来自过滤器图表的视频或来自您的输入之一的音频(哪一个完全取决于默认流选择行为,因为我没有看到您做任何事情与命令中的音频)。

IIRC,可能存在涉及过滤和-shortest未执行预期操作的现有错误,但我目前无法回忆起详细信息,也懒得查看。只是需要注意一些事情。