您似乎已经了解如何从视频中提取音频流,因此我们将跳过该步骤。
假设您有一个名为video.mp4 的视频文件和一个名为audio.mp3 的音频文件。您想从视频中截取静止图像并以audio.mp3 作为音轨创建幻灯片。
首先我们将提取静止图像。 fps=1/10 表示每十秒提取一次帧。 -ss 00:00:5 表示我们将在五秒后开始。视频的开头通常是淡入,其中大部分是黑色,因此可能需要跳过它。
ffmpeg -ss 00:00:5 -i video.mp4 -vf fps=1/10 image%03d.png
接下来,我们将计算生成的图像数量。这将有助于我们在指定幻灯片的帧速率时知道。
imgcount=$(find . -maxdepth 1 -name "image*" | wc -l)
echo $imgcount
音轨的持续时间也很高兴知道。对于 MP3 和类似格式,尤其是在以可变比特率编码时,持续时间的估计可能令人担忧。为了解决这个问题,可以将音频文件转换为 WAV 文件 f.ex,然后估算持续时间。
adur=$(ffprobe -v error -select_streams a:0 -show_entries stream=duration \
-of default=noprint_wrappers=1:nokey=1 audio.mp3)
echo $adur
现在我们将图像重新组合成幻灯片。 $imgcount/$adur 指定静止图像的显示速率,因此持续时间与音频文件的持续时间相当匹配。 -r 25 指定视频的实际帧率。并非所有格式和视频播放器都接受异常帧率。
ffmpeg -framerate $imgcount/$adur -i image%03d.png -c:v libx264 -r 25 \
-pix_fmt yuv422p slideshow.mp4
这将混合音频文件和幻灯片文件并修剪到两者中最短的持续时间。如果容器格式支持音频文件的编解码器,则此方法有效,否则必须重新转换音频文件或选择其他容器格式。我发现 Matroska (.mkv) 非常有用。对于.avi 和.ac3 或.mp4 和.mp3 应该没有问题。
ffmpeg -i slideshow.mp4 -i audio.mp3 -codec copy -shortest slideshow-sound.mp4