创建视频形式的图像和视频并以编程方式向其添加音频 | Java、Python、ffmpeg

Create a video form images and videos and add audio to it programatically | Java, Python, ffmpeg

我想创建一个新视频(finalVideo.mp4):

  1. 3 个图像文件image1.jpg, image2.jpg, image3.jpg,每个图像可观看 4 秒
  2. 1个视频文件(video1.mp4),时长约30秒,帧率为30fps
  3. 1 个音频文件 (audio1.mp3)

在最终视频 (finalVideo.mp4) 中,我希望音频 (audio1.mp3) 仅在图像存在时播放,视频 (video1.mp4) 音频在视频存在时播放现在。

例如: 最终视频 (finalVideo.mp4) 包含 image1.jpg, video1.mp4, image2.jpgimage3.jpg(按顺序)。音频 (audio1.mp3) 应该播放前 4 秒,然后视频 (video1.mp4) 的音频播放接下来的 30 秒,然后音频 (audio1.mp3) 播放接下来的 8 秒 (4 *2) 秒。

请告诉我如何以编程方式执行此操作。我希望使用 Java (JavaCV) 或 Python (OpenCV) 来解决这个问题。但是没有编程语言限制,可以用任何语言回答。


编辑 1

以下是我的尝试:

String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
        ProcessBuilder processBuilder = new ProcessBuilder(
                ffmpeg,
                "-loop", "1",
                "-framerate", "30",
                "-t", "4",
                "-i", "image1.jpg",
                "-i", "video1.mp4",
                "-loop", "1",
                "-framerate", "30",
                "-t", "4",
                "-i", "image2.jpg",
                "-loop", "1",
                "-framerate", "30",
                "-t", "4",
                "-i", "image3.jpg",
                "-filter_complex", "[0][1][2][3]concat=n=4:v=1:a=0",
                "finalVideo.mp4"
        );
        processBuilder.inheritIO().start().waitFor();

以上代码只解决了没有音频的视频制作部分。请让我知道如何如上所述向该视频添加音频。

您可以对音频执行相同的操作,使用 -ss-t 输入选项来控制剪辑的位置。

String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
        ProcessBuilder processBuilder = new ProcessBuilder(
                ffmpeg,
                "-loop", "1",
                "-framerate", "30",
                "-t", "4",
                "-i", "image1.jpg",
                "-i", "video1.mp4",
                "-loop", "1",
                "-framerate", "30",
                "-t", "4",
                "-i", "image2.jpg",
                "-loop", "1",
                "-framerate", "30",
                "-t", "4",
                "-i", "image3.jpg",
                "-t" 4, "-i", "audio1.mp3",
                "-ss" 4, "-t", 8, "audio1.mp3",
                "-filter_complex", 
                "[0][1:v][2][[3]concat=n=4:v=1:a=0;[4][1:a][5]concat=n=3:v=0:a=1;",
                "finalVideo.mp4"
        );
        processBuilder.inheritIO().start().waitFor();

(如果您可以两次使用相同的输入文件,则不是 100%,但这应该可行。)