FFmpeg IF/ELSE 语句

FFmpeg IF/ELSE statement

我正在对很多视频文件进行重新编码,有时其中一些包含字幕,有些则没有。是否可以“忽略” -vf "subtitles=%%f:force_style='MarginV=25,Fontsize=20'" -sn FFmpeg 命令中的语句 IF 输入文件没有包含字幕?

我的命令是:

for %%f in (*.mkv) do ffmpeg -hwaccel nvdec -i "%%f" -strict -2 -max_muxing_queue_size 1024 -map_metadata -1 -map_chapters -1 -vf "subtitles=%%f:force_style='MarginV=25,Fontsize=20'" -sn -c:v hevc_nvenc -rc vbr -cq 24 -qmin 24 -qmax 24 -tier high -level 4 -preset medium -profile:v main10 -pix_fmt p010le -b:v 0K -ac 6 -ar 48000 -b:a:0 640k -c:a:0 ac3 -metadata:s:a:0 title="Dolby Digital" E:\Encoded\%%f

请注意,一批文件超过100个,手动检查非常耗时。

也许正确的做法是先在批处理脚本中检查文件,如果该文件有字幕,则执行第一个命令,如果没有字幕,则执行第二个命令。但是,我不知道如何编写这样的脚本。

在“被迫”研究和学习如何做到这一点之后,我找到了一个解决方案,所以如果将来有人可能需要这样的东西:

SET subs=ffmpeg -hwaccel nvdec -i "%%f" -strict -2 -max_muxing_queue_size 1024 -map_metadata -1 -map_chapters -1 -vf "subtitles=%%f:force_style='MarginV=25,Fontsize=20'" -sn -c:v hevc_nvenc -rc vbr -cq 24 -qmin 24 -qmax 24 -tier high -level 4 -preset medium -profile:v main10 -pix_fmt p010le -b:v 0K -ac 6 -ar 48000 -b:a:0 640k -c:a:0 ac3 -metadata:s:a:0 title="Dolby Digital" E:\Encoded\%%f
SET nosubs=ffmpeg -hwaccel nvdec -i "%%f" -strict -2 -max_muxing_queue_size 1024 -map_metadata -1 -map_chapters -1 -sn -c:v hevc_nvenc -rc vbr -cq 24 -qmin 24 -qmax 24 -tier high -level 4 -preset medium -profile:v main10 -pix_fmt p010le -b:v 0K -ac 6 -ar 48000 -b:a:0 640k -c:a:0 ac3 -metadata:s:a:0 title="Dolby Digital" E:\Encoded\%%f

for %%f in (*.mkv) do ffmpeg -i "%%f" -c copy -map 0:s -f null - -v 0 -hide_banner && %subs% || %nosubs%

脚本基本上检查文件是否有字幕,并根据输出执行正确的命令。我认为它也可以用于其他使用场景。

注意:它是针对Windows批处理的,在Linux...

下不会像这样工作