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
)
如果源将“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
)