优化 ffmpeg 覆盖和循环过滤器

Optimize ffmpeg overlay and loop filters

我有一个 30 秒的视频 video.mp4,我有一个可以改变长度的音频 audio.mp3.

我的最终想法是输出一个 video.mp4 的循环输出视频作为 audio.mp3 的总长度,并覆盖 audio.mp3。我所做的是,在 bash 脚本中:

# calculate length of the audio and of the video
tot=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 audio.mp3)
vid=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 video.mp4)
# how many base video we need to loop into the waveform video?
repeattime=`echo "scale=0; ($tot+$vid-1)/$vid" | bc`

# ffmpeg final command
ffmpeg -stream_loop $repeattime -i video.mp4 -i audio.mp3 -filter_complex "[1:a]showwaves=s=1280x100:colors=Red:mode=cline:rate=25:scale=sqrt[outputwave]; [0:v][outputwave] overlay=0:main_h-overlay_h [out]" -map '[out]' -map '1:a' -c:a copy -y output.mp4

有没有更好的方法在单个 ffmpeg 命令中完成它?我知道它在 ffmpeg 中存在 loop filter,但它循环帧,我不知道 video.mp4 的帧数。此外,使用 $repeattime 会导致循环次数超过需要的次数(因为数学计算是向上舍入的)

-shortest 对您有帮助:

#!/bin/bash
ffmpeg -hide_banner -stream_loop -1 -i "input 1.mp4" -i "input 1.mp3" -filter_complex "
[1:a]showwaves=s=1280x100:colors=Red:mode=cline:rate=25:scale=sqrt[outputwave];
[0:v][outputwave] overlay=0:main_h-overlay_h [v]
" -map [v] -map 1:a -c:a copy -shortest -y output.mp4

您可以在叠加层中使用最短的选项。

ffmpeg -stream_loop -1 -i video.mp4 -i audio.mp3 -filter_complex "[1:a]showwaves=s=1280x100:colors=Red:mode=cline:rate=25:scale=sqrt[outputwave]; [0:v][outputwave] overlay=0:main_h-overlay_h:shortest=1 [out]" -map '[out]' -map '1:a' -c:a copy -y output.mp4