ffmpeg - 有没有办法 -map 0:m:language:eng 如果存在,否则使用默认值?

ffmpeg - is there a way to -map 0:m:language:eng if it exists, otherwise use the default?

如果源将“eng”作为音轨,则使用该音轨,否则使用默认音轨或音轨零?

这可能吗?

我试过:

 -map 0:m:language:eng? -map 0:a:0?

但这最终总是使用默认的。

好问题。我不认为 ffmpeg 有这个功能,所以我最终写了一个 .bat 脚本来模仿它。该脚本使用 ffprobe 来探测媒体文件。对于每个流,如果设置了语言属性并且该语言 != "eng",请忽略它。否则,映射所有没有语言的流 + 那些有 "eng" 语言的流,并复制到 basename-fixed.ext.

它可能比它应该的更复杂,但您可能会发现它很有用。 *耸肩*

@echo off

for %%I in (*.mkv *.mp4) do (
    setlocal
    for /f "delims=" %%x in (
        'ffprobe -v quiet -show_entries "stream=codec_name:stream_tags=language" -of flat "%%~I"'
    ) do set "%%~x"
    for /f "tokens=1* delims==" %%a in ('set streams') do (
        echo(%%a | find /i "language" >NUL && if /i not "%%~b"=="eng" (
            for /f "tokens=1-3 delims=." %%p in ("%%a") do (
                for /f "tokens=1 delims==" %%s in ('set %%p.%%q.%%r') do set "%%~s="
            )
        )
    )

    setlocal enabledelayedexpansion
    for /f "tokens=3 delims=." %%x in ('set streams ^| find "codec_name"') do (
        if not defined map (
            set "map=-map 0:%%x"
        ) else set "map=!map! -map 0:%%x"
    )
    echo ffmpeg -i "%%~I" !map! -c:v copy -c:a copy -c:s copy "%%~nI-fixed%%~xI"
    ffmpeg -i "%%~I" !map! -c:v copy -c:a copy -c:s copy "%%~nI-fixed%%~xI"
    endlocal
    endlocal
)