我有几个图像(幻灯片)和几个音频文件,我想使用C#,AForge和ffmpeg,或者你可能建议的任何其他东西。 有几个音频文件,每个文件在一个图像中读取文本。
图像分为两组 - 具有相应音频文件的图像和没有相应音频文件的图像。
逻辑和机制非常简单,但我不知道如何实现它
我会使用哪些类别或对象?
我是否需要在两幅图像之间绘制每一帧?
注意:图像代表幻灯片,PowerPoint演示文稿,每张幻灯片都保存为jpeg图片。
编辑:示例 我们说我有5张图片,其中两张有相应的音频文件,因此有两个音频文件。
图像1显示4秒钟。
出现图像2,播放音频1,音频停止,图像2消失。
图像3显示4秒钟。
图像4显示4秒钟。
出现图像5,播放音频2,音频停止,图像5消失。
答案 0 :(得分:1)
您可以使用concat filter。使用示例中提供的参数:
ffmpeg \
-f lavfi -t 1 -i anullsrc=channel_layout=stereo:sample_rate=44100 \
-loop 1 -t 4 -i 01.jpg \
-loop 1 -t 3 -i 02.jpg \
-i 02.wav \
-loop 1 -t 4 -i 03.jpg \
-loop 1 -t 4 -i 04.jpg \
-loop 1 -t 6 -i 05.jpg \
-i 05.wav \
-filter_complex \
"[1:0][0:0][2:0][3:0][4:0][0:0][5:0][0:0][6:0][7:0]concat=n=5:v=1:a=1[vv][a]; \
[vv]format=yuv420p[v]" \
-map "[v]" -map "[a]" \
-c:v libx264 -c:a aac -movflags +faststart output.mp4
您可以使用ffprobe
获取每个音频输入的持续时间:
ffprobe -v error -select_streams a:0 -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 02.wav
结果输出可用作-t
命令中相应ffmpeg
的变量。
在此示例中,02.wav
为3秒,因此-t 3
用于02.jpg
设置3秒的持续时间,05.wav
为6秒长,因此-t 6
用于05.jpg
。
您没有提到所需的输出格式,因此我在MP4容器中选择了H.264视频和AAC音频。如果这不是您想要的,请删除-movflags +faststart
,删除格式过滤器,然后重命名视频地图。
anullsrc filter生成无声音频。它的持续时间只需要短于最短的音频输入:concat过滤器将自动填充其余部分以匹配相应的视频片段。如果需要,您可以调整channel_layout
和sample_rate
以匹配您的音频输入。请注意,如果它们不同,那么concat过滤器将自动选择常见的采样率,样本格式和通道布局,因此如果输出与预期不同,那么这就是原因。
或者,您可以使用流说明符来命名对concat过滤器的输入。我通常会这样做,但是在脚本命令中,它可能没什么意义。无论如何,在这种情况下它将是:
[1:v][0:a][2:v][3:a][4:v][0:a][5:v][0:a][6:v][7:a]
将这些示例改编为您喜欢的脚本语言取决于您。