使用“filter_complex”时如何动态限制“stream_loop -1”?

使用“filter_complex”时如何动态限制“stream_loop -1”?

我有 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

如果有帮助的话,请尝试连接,这样总持续时间将由音频输入决定。

相关内容