Gute Frage. Ich glaube nicht, dass ffmpeg diese Funktion hat, also schrieb ich ein .bat-Skript, um es nachzuahmen. Das Skript verwendet ffprobe
, um die Mediendatei zu prüfen. Für jeden Stream, wenn ein Sprachattribut gesetzt ist und diese Sprache! = "Eng", weglassen. Andernfalls mappen Sie alle Streams ohne Sprache und solche mit der Sprache "eng" und kopieren Sie sie in basename-fixed.ext.
Es ist wahrscheinlich komplizierter als es sein sollte, aber Sie könnten es nützlich finden. * Achselzucken *
@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
)
Ja, leider ffprobe eine zusätzliche Verzögerung ist zuerst die Informationen zu erhalten. ffmpeg muss der schlechteste Code sein, den ich jemals gesehen habe und der schlimmste api aller Zeiten. – momomo