创建视频形式的图像和视频并以编程方式向其添加音频 | Java、Python、ffmpeg
Create a video form images and videos and add audio to it programatically | Java, Python, ffmpeg
我想创建一个新视频(finalVideo.mp4
):
- 3 个图像文件
image1.jpg, image2.jpg, image3.jpg
,每个图像可观看 4 秒
- 1个视频文件(
video1.mp4
),时长约30秒,帧率为30fps
- 1 个音频文件 (
audio1.mp3
)
在最终视频 (finalVideo.mp4
) 中,我希望音频 (audio1.mp3
) 仅在图像存在时播放,视频 (video1.mp4
) 音频在视频存在时播放现在。
例如:
最终视频 (finalVideo.mp4
) 包含
image1.jpg
,
video1.mp4
,
image2.jpg
和
image3.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%,但这应该可行。)
我想创建一个新视频(finalVideo.mp4
):
- 3 个图像文件
image1.jpg, image2.jpg, image3.jpg
,每个图像可观看 4 秒 - 1个视频文件(
video1.mp4
),时长约30秒,帧率为30fps - 1 个音频文件 (
audio1.mp3
)
在最终视频 (finalVideo.mp4
) 中,我希望音频 (audio1.mp3
) 仅在图像存在时播放,视频 (video1.mp4
) 音频在视频存在时播放现在。
例如:
最终视频 (finalVideo.mp4
) 包含
image1.jpg
,
video1.mp4
,
image2.jpg
和
image3.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%,但这应该可行。)