我有 2 个输入,一个视频文件和一个音频文件。
视频输入应该是背景视频,这意味着它应该无限重复(音频和视频),并且其音频组件音量应降低到 15%。
另外,我希望对背景视频组件进行过滤(我使用hue
过滤器作为示例)。
第二个输入应与 1 的输入音频混合(音量降低至 15%),并确定总输出视频长度。
我尝试了这个:
ffmpeg -stream_loop -1 -i vid.mp4 -i aud.mp3 -filter_complex \
"[0:a]volume=0.15[a0]; \
[1:a][a0]amix=inputs=2:duration=shortest:dropout_transition=0[audio]; \
[0:v]hue=h=90[video]" -map "[audio]" -map "[video]" -pix_fmt yuv420p -shortest out.mp4
但它不起作用(vid.mp4
无休止重复,没有音频)。
然而,这:
'ffmpeg -stream_loop -1 -i vid.mp4 -i aud.mp3 -filter_complex \
"[0:a]volume=0.15[a0];[a0][1:a]amix=inputs=2:duration=shortest:dropout_transition=0[audio];" \
-map 0:v -map "[audio]" -pix_fmt yuv420p -shortest out.mp4'
有效(但我也需要filter_complex
视频)。
我该如何实现?这是一个错误吗?
答案1
这是一个记录错误:同时使用音频和视频过滤器-shortest
时将不起作用。-filter_complex
也就是说,最简单的选择是-t
在输入前添加并插入音频的长度,同时设置-stream_loop
为无限以外的值。假设您的音频为 10 分钟或 600 秒,您将-t 600
在输入文件之前使用:
ffmpeg -t 600 -stream_loop 1000 -i vid.mp4 -i aud.mp3 -filter_complex \
"[0:v]hue=h=90[video]; \
[0:a]volume=0.15[a0]; \
[1:a][a0]amix=inputs=2:duration=shortest:dropout_transition=0[audio]" -map "[audio]" -map "[video]" -pix_fmt yuv420p out.mp4
答案2
听起来您想无限循环播放背景视频并将其音频(音量降低)与另一个音频文件合并。您想对视频流应用过滤器,还希望输出的长度由第二个音频文件决定。似乎当前命令无法同时应用视频过滤器和循环播放视频。
尝试以下命令:
ffmpeg -stream_loop -1 -i vid.mp4 -i aud.mp3 -filter_complex \
"[0:v]hue=h=90,loop=0:32767:0,setpts=N/FRAME_RATE/TB[v];[0:a]volume=0.15[a0];[1:a][a0]amix=inputs=2:duration=shortest[a]" \
-map "[v]" -map "[a]" -shortest out.mp4
在此命令中,我直接在过滤器组合中添加了循环过滤器,以循环播放视频。setpts=N/FRAME_RATE/TB
过滤器确保时间戳设置正确。
答案3
ffmpeg -stream_loop -1 -i vid.mp4 -i aud.mp3 -filter_complex \
"[0:v]hue=h=90,setpts=PTS-STARTPTS[filtered_video]; \
[0:a]volume=0.15[a0]; \
[filtered_video][a0]concat=n=1:v=1:a=1[output_video][output_audio]" \
-map "[output_video]" -map "[output_audio]" -pix_fmt yuv420p out.mp4
如果有帮助的话,请尝试连接,这样总持续时间将由音频输入决定。