微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化ffmpeg覆盖和循环过滤器

如何解决优化ffmpeg覆盖和循环过滤器

我有一个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 中存在循环过滤器,但是它循环播放帧,我不知道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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。