You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在批处理脚本中复用命令输出以保留MKV音频语言

批处理脚本实现:提取MP4音视频并合并为带原音频语言的MKV

以下是完整的批处理脚本,整合了ffmpeg提取、mediainfo获取语言码、mkvmerge合并并设置语言的逻辑,同时处理路径含空格的问题:

@echo off
setlocal enabledelayedexpansion

:: 遍历当前文件夹下所有MP4文件
for %%f in ("*.mp4") do (
    :: 定义临时文件和输出文件名(基于原文件名)
    set "video_temp=%%~nf_video.h264"
    set "audio_temp=%%~nf_audio.aac"
    set "output_mkv=%%~nf.mkv"

    :: 步骤1:用ffmpeg提取视频流和音频流(直接复制编码,无转码)
    echo 正在处理文件: "%%f"
    "ffmpeg.exe" -i "%%f" -c:v copy -an "!video_temp!"
    "ffmpeg.exe" -i "%%f" -c:a copy -vn "!audio_temp!"

    :: 步骤2:用mediainfo提取音频轨道的3位语言代码(en/ja/es等)
    for /f "delims=" %%l in ('"mediainfo.exe" --Inform="Audio;%%Language/String3" "%%f"') do (
        set "audio_lang=%%l"
    )

    :: 步骤3:用mkvmerge合并并设置音频语言
    if not "!audio_lang!"=="" (
        :: 给视频和音频流分别指定语言(单流文件索引都是0)
        "mkvmerge.exe" -o "!output_mkv!" --language 0:!audio_lang! "!video_temp!" --language 0:!audio_lang! "!audio_temp!"
    ) else (
        :: 未提取到语言时,直接合并
        "mkvmerge.exe" -o "!output_mkv!" "!video_temp!" "!audio_temp!"
        echo 警告:未获取到"%%f"的音频语言信息,已默认合并
    )

    :: 清理临时文件
    del "!video_temp!" "!audio_temp!"
)

echo 所有文件处理完成!
pause

关键逻辑说明

  1. 路径空格处理:所有涉及文件路径的地方都用双引号包裹,包括命令本身(比如"ffmpeg.exe"),避免路径含空格时命令执行失败。
  2. 语言码捕获:通过mediainfo的--Inform参数指定输出格式,直接提取3位语言代码;用for /f "delims="确保输出内容被完整捕获。
  3. mkvmerge语言设置:使用--language 0:!audio_lang!参数为每个流指定语言,这里因为是单独提取的视频/音频单流文件,所以流索引都是0。
  4. 临时文件清理:处理完每个文件后自动删除临时的.h264和.aac文件,避免磁盘占用。

注意事项

  • 确保ffmpeg.exe、mediainfo.exe、mkvmerge.exe位于当前脚本目录,或已添加到系统PATH环境变量中;如果不在上述位置,需替换为完整路径(比如"C:\Tools\ffmpeg\bin\ffmpeg.exe")。
  • 本脚本默认处理MP4中的第一个音频轨道,如果需要处理多音频轨道,需调整mediainfo的提取规则和mkvmerge的参数(例如遍历多个音频轨道并分别设置语言)。

内容的提问来源于stack exchange,提问作者jaimepm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:15:28