ffmpeg将多张图片放入不同的帧

ffmpeg put multiple pictures into different frames

我在 Python 中的数组看起来像这样 [['0.3251', '6.5712', '12.8174', '13.3979', '13.9784', '14.5357', '14.9537', '15.1394', '15.5109', '16.3236', '16.5094', '16.6951', '17.2524', '17.6704', '18.0419']] 我需要将一张图像放在与 ffmpeg 数组中完全相同的那一秒。我怎样才能做到这一点? 例如,我想要一个带歌曲的视频 在第一个 0.3251s of the video i want to put img1 第二个 6.5712s of the video i want to put img2 等等。

很遗憾,我对 Python 了解不多,但这里有一个 Windows 批处理文件的示例,您可以如何使用 FFmpeg 创建带有图像和声音的视频。

此示例使用 mp3 个带声音的文件、三个 jpg 个带图像的文件和两个起点:0.32516.5712。第一张图像将从输出视频开始显示到 0.3251,第二张图像将从 0.3251 显示到 6.5712,第三张图像将从 6.5712 显示到结束的声音。您可以按照相同的模式轻松添加更多输入图像和起点(我在本文末尾提供了一个示例 post)。

ffmpeg.exe -i input.mp3 -loop 1 -i input1.jpg -loop 1 -i input2.jpg -loop 1 -i input3.jpg -filter_complex ^
 ^"[1:v]trim=duration=0.3251[a]; ^
   [2:v]trim=start=0.3251:end=6.5712,setpts=PTS-STARTPTS[b]; ^
   [a][b]concat[c]; ^
   [3:v]trim=start=6.5712,setpts=PTS-STARTPTS[d]; ^
   [c][d]concat[video]^" ^
  -map [video]:v -map 0:a -c:v libx264 -crf 18 -c:a copy -shortest output.mp4

-i 告诉 FFmpeg 使用以下输入作为下一个操作的流源。

input.mp3是带声音的输入文件。

inputX.jpg 是带有图像的输入文件。

-loop 告诉 FFmpeg 循环下一个输入图像。

-filter_complex 告诉 FFmpeg 使用以下过滤器。

trim是设置特定图像持续时间的过滤器类型,它可以与duration选项一起使用,也可以与startend选项一起使用(这是您需要粘贴起点值的地方。

concat 是将视频的前两部分合并为可用于下一个 concat 操作的一部分的滤镜类型。

-map 告诉 FFmpeg 应使用哪些流(视频和音频)来创建输出文件。

-c 告诉 FFmpeg 应该使用什么编解码器来对视频和音频进行编码以创建输出文件。

-shortest 告诉 FFmpeg 使用最短的输入流作为输出的持续时间(在这种情况下,它是带有声音的输入文件,因为所有图像都在无限循环中)。

^ 是 Windows 用于将一个长命令拆分为几行代码的批处理特定字符。您可以删除所有 ^ 并改用一个长命令:

ffmpeg.exe -i input.mp3 -loop 1 -i input1.jpg -loop 1 -i input2.jpg -loop 1 -i input3.jpg -filter_complex "[1:v]trim=duration=0.3251[a]; [2:v]trim=start=0.3251:end=6.5712,setpts=PTS-STARTPTS[b]; [a][b]concat[c]; [3:v]trim=start=6.5712,setpts=PTS-STARTPTS[d]; [c][d]concat[video]" -map [video]:v -map 0:a -c:v libx264 -crf 18 -c:a copy -shortest output.mp4

如何添加下一张图片?

您需要再添加一个图像作为输入并更改当前过滤器集中的最后几行:

   [a][b]concat[c]; ^
   [3:v]trim=start=6.5712,setpts=PTS-STARTPTS[d]; ^
   [c][d]concat[video]^" ^

与:

   [a][b]concat[c]; ^
   [3:v]trim=start=6.5712:end=12.8174,setpts=PTS-STARTPTS[d]; ^
   [c][d]concat[e]; ^
   [4:v]trim=start=12.8174,setpts=PTS-STARTPTS[f]; ^
   [e][f]concat[video]^" ^

字母[a][b][c]是变量的名称——你可以在这里使用任意字母组合,而不仅仅是一个字母。例如:[aa][ab]concat[ac] 也可以,[video] 也是此命令中使用的变量名。