ffmpeg图像和音频到视频

时间:2016-02-20 21:08:15

标签: c# ffmpeg

我有几个图像(幻灯片)和几个音频文件,我想使用C#,AForge和ffmpeg,或者你可能建议的任何其他东西。 有几个音频文件,每个文件在一个图像中读取文本。

图像分为两组 - 具有相应音频文件的图像和没有相应音频文件的图像。

  1. 没有音频的图像应显示一段预定义的时间(for 例子4秒)。
  2. 应显示带有音频的图像,音频从它们开始 只要相应的音频播放,就会出现。
  3. 逻辑和机制非常简单,但我不知道如何实现它 我会使用哪些类别或对象?
    我是否需要在两幅图像之间绘制每一帧?

    注意:图像代表幻灯片,PowerPoint演示文稿,每张幻灯片都保存为jpeg图片。

    编辑:示例 我们说我有5张图片,其中两张有相应的音频文件,因此有两个音频文件。

    图像1显示4秒钟。

    出现图像2,播放音频1,音频停止,图像2消失。

    图像3显示4秒钟。

    图像4显示4秒钟。

    出现图像5,播放音频2,音频停止,图像5消失。

1 个答案:

答案 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_layoutsample_rate以匹配您的音频输入。请注意,如果它们不同,那么concat过滤器将自动选择常见的采样率,样本格式和通道布局,因此如果输出与预期不同,那么这就是原因。

  • 或者,您可以使用流说明符来命名对concat过滤器的输入。我通常会这样做,但是在脚本命令中,它可能没什么意义。无论如何,在这种情况下它将是:

    [1:v][0:a][2:v][3:a][4:v][0:a][5:v][0:a][6:v][7:a]
    
  • 将这些示例改编为您喜欢的脚本语言取决于您。