所以我有两个视频:Vid_eng.mkv 是一个高分辨率视频,带有英语音频。Vid_esp.mkv 是一个低分辨率视频,带有西班牙语音频。这两个视频显示的或多或少......
我有两个视频:
Vid_eng.mkv
是一个带有英语音频的高分辨率视频。
Vid_esp.mkv
是一个低分辨率视频,带有西班牙语音频。
这两个视频展示的内容大致相同,但不同之处在于西班牙语视频的开头和结尾被剪掉了(缺少前 66 秒)。
我想创建一个新的视频文件, Vid_out.mkv
其中包含 Vid_eng.mkv
视频和音频(因此最终文件具有多流音频)。问题是西班牙语音频与高分辨率视频不同步,所以我做了以下事情:
ffmpeg -i Vid_eng.mkv
-f lavfi -t 66 -i anullsrc -i Vid_esp.mkv
-filter_complex "[1:a][2:a]concat=n=2:v=0:a=1[outa]"
-map 0 -map "[outa]"
-metadata:s:a:0 language=eng
-metadata:s:a:1 language=spa
-disposition:a:1 default
-c:v copy Vid_out.mkv
我在这里所做的基本上是 Vid_out.mkv
使用来自 的视频 Vid_eng.mkv
和 Vid_eng.mkv
的音频多流来 Vid_esp.mkv
,但不同的是来自 的音频 Vid_esp.mkv
实际上是在 66 秒后开始的(以便与英语视频同步)。我通过添加 66 秒的静音(带有 -f lavfi -t 66 -i anullsrc
)并将该静音与西班牙语音频(带有 -filter_complex "[1:a][2:a]concat=n=2:v=0:a=1[outa]"
)连接起来,然后将此连接的音频流作为辅助音频添加到最终文件。此外,我还包含了一些元数据以了解哪个音频是哪个。
目前一切都很好。但现在我想尝试一些更复杂的东西:我不想将 66 秒的静音连接到西班牙语音频,而是想要 66 秒的英语音频(来自 的音频 Vid_eng.mkv
),然后是来自 的音频 Vid_esp.mkv
,最后当西班牙语音频结束并且视频仍在播放时,我想要再次播放英语音频。因此,当使用辅助音频流播放视频时,我想要的是播放英语音频,而不是在视频的开头和结尾处保持静音。如何使用 ffmpeg 做到这一点?
作为参考,我一直遵循这些答案中的想法:
,通过单个命令来实现接近效果 sidechaincompress 。
ffmpeg -i Vid_eng.mkv
-i Vid_esp.mkv
-filter_complex "[1:a]adelay=66000:all=1,asplit=2[esp][ref];
[0:a][ref]sidechaincompress=threshold=0.125:ratio=20[eng];
[eng][esp]amix=inputs=2:duration=first:normalize=0[outa]"
-map 0 -map "[outa]"
-metadata:s:a:0 language=eng
-metadata:s:a:1 language=spa
-disposition:a:1 default
-c:v copy Vid_out.mkv
这将创建英语音频的克隆,并在西班牙语音频处于活动状态时降低其音量。然后将处理后的英语和西班牙语混合在一起。使用 sc 过滤器进行实验以优化英语克隆的音量。