FFmpeg 映射可选(音频)流

FFmpeg 映射可选(音频)流

我使用此命令来生成缩放并带有覆盖图像的文件:

ffmpeg 
-i input.* -i overlay.png 
-filter_complex "[0:v]...; ...[1:v]overlay=... ... [resultingvideo]" 
-map "[resultingvideo]" -vcodec libx264 -f mp4 
-acodec libmp3lame -q:a 50 
outputfilename.mov

其中“...”代表一些遗漏的过滤。

问题是没有音频。

如果我添加-map 0:a,如果输入有音频,则会有音频,如果输入没有音频,则会出错并且没有输出文件。

如果输入中存在音频,我怎样才能让 ffmpeg 选择性地使用它,否则忽略音频或产生静音等?

或者,我是否必须先使用 ffprobe 分析文件,然后才能生成脚本命令?

答案1

ffmpeg 的最新版本支持条件映射选项

ffmpeg -i input.mp4 -map "0:a?" output.mp4

这将忽略输入文件中不存在的音频流。

答案2

如果您愿意运行 ffmpeg 两次,您可以先进行覆盖,然后执行第二个命令来复制该视频并从原始视频中编码音频。如果音频不存在,ffmpeg 会发出警告并执行任何操作。如果它成功了,那么您将获得音频和视频。

它看上去有点像这样。

ffmpeg -i input.* -i overlay.png -filter_complex "[0:v]...; ...[1:v]overlay=... ... [resultingvideo]" -map "[resultingvideo]" -vcodec libx264 -f mp4 outputfilenameJustVideo.mov

其次是

ffmpeg -y -i outputfilenameJustVideo.mov -i input.*
-acodec libmp3lame -q:a 50 -c:v copy -map 0:v -map 1:a outputfilename.mov

根据我的简单测试,当没有音频时,ffmpeg 不会创建/覆盖任何内容,而当有音频时则会创建/覆盖任何内容。

需要明确的是,这是一种 hack。您可能希望使用某种逻辑将最终产品重命名为您想要的任何名称。

我不知道有一个简单的、单命令的方法。

相关内容