我正在尝试编写一个批处理脚本,使用
ffmpeg
从同一文件夹中的某些 mp4 中提取音频和视频,然后将它们重新合并到 mkv 中,但试图保留音频语言。
我得到了一个完美运行的脚本,无需考虑语言:
chcp 65001
for %%a in (*.mp4) do (
"ffmpeg" -i %%a -c:v copy -bsf hevc_mp4toannexb "%%~na.h265" -c:a copy "%%~na.aac"
del %%a
"mkvmerge" -o "%%~na.mkv" "%%~na.h265" "%%~na.aac"
)
那个工作顺利。
我有另一个脚本,它输出音频语言以提供 mkvmerge 代码,我得到了这个:
chcp 65001
for %%a in (*.mp4) do (
"mediainfo" --Output=Audio;%%Language/String2%% "%%a"
)
我得到了代码(
en
、ja
、es
等)。
问题是我不知道如何设置第二个脚本的输出以在第一个脚本中使用它。
我应该存储第二个的输出,
mkvmerge
命令将是这样的:
"mkvmerge" -o "%%~na.mkv" "%%~na.h265" --language TID:(output from the other script) "%%~na.aac"
这样每个新的 mkv 都会保留 mp4 中的原始音频语言。
我今天一直在寻找它,但找不到我需要的答案。
PS:不要问为什么我需要这样,而不是直接将 mp4 重新混合到 mkv,我只是需要这样。
顺便说一句,
ffmpeg
、mediainfo
和mkvmerge
是双引号的,因为它们不是我笔记本电脑中的环境变量,所以我只是将路径设置为exe的路径,并且其中有空格。
FOR /F 命令用于捕获命令的输出。这是未经测试的。
chcp 65001
for %%a in (*.mp4) do (
FOR /F "delims=" %%G IN ('^""C:\MediaInfo\MediaInfo.exe" "--Output=Audio;[%%Language/String2%%]" "%%a"^"') DO (
"mkvmerge" -o "%%~na.mkv" "%%~na.h265" --language TID:%%G "%%~na.aac"
)
)