批量合并/多路复用 .srt 与 .mkv 文件

批量合并/多路复用 .srt 与 .mkv 文件

我有一个文件夹,其中包含:

  • TVShow - 第 01 集.mkv
  • TVShow - 第 01 集.srt
  • TVShow - 第 02 集.mkv
  • TVShow - 第 02 集.srt
  • TVShow - 第 03 集.mkv
  • TVShow - 第 03 集.srt

等等...

我已经知道我可以用 MKVMerge 逐个执行此操作。这会花费相当多的时间,所以...我想制作一个批处理脚本,可以使用 MKVToolNix、mkvmerge 或类似程序对文件夹中的所有文件执行此操作。

我还需要批处理脚本是相对的,以便以后当文件名不同时可以应用该脚本。文件名可能不总是“TVShow”,而是“Second TV Show”。

1. 我想将外部字幕文件(srt)混编到相应的电影文件(mkv)中。

2. 我还想将字幕设为相应电影文件的默认和强制字幕。

我怎样才能制作这样的批处理脚本?我对批处理脚本有一些了解,我在 Google 上搜索了几个小时,却没有找到任何有用的信息。

我开始用这个,但它不起作用,也没有将字幕设置为默认或强制:

"B:\OneDrive\Portable applications\mkvtoolnix\mkvmerge.exe" "FOR %%A IN (*.mkv) DO mkvmerge -o "remux-%%~nA.mkv" "%%~A" "%%~dpnA.srt"

答案1

for %%A IN (*.mkv) do (
"B:\OneDrive\Portable applications\mkvtoolnix\mkvmerge.exe" -o "remux-%%~nxA" "%%~A" "%%~nA.srt"
echo  Replace this Line with your othr commands!
)

看看mkvpropedit -- 修改现有 Matroska 的属性更改 MKV 文件中的默认语言/字幕

答案2

我在另一个答案中找到一个很好的例子[1],使用下面的一般草图:

for %%f in (*.mkv) do (
        echo %%~nf
         mkvmerge -o "%%~nf_New.mkv" "%%~nf_New.mkv" --language 0:eng "%%~nf.srt"

)

我在 mkvmerge 网站上找到了更类似的例子[2]

mkvmerge -o with-lang-codes.mkv --language 2:ger --language 3:dut \
--default-track 3 without-lang-codes.mkv --language 0:eng english.srt \
--default-track 0 --language 0:fre french.srt

放进去循环for,在单一情况下工作的命令行,使用 更改 mkv 文件 %%~nf.mkv并使用 更改 srt %%~nf.srt以及在正确的位置更改所有选项。

答案3

我遇到了与您相同的问题,并整理了以下 PowerShell 脚本以实现字幕的批量混合。

#Batch Merge Subtitles with MKVMerge - Iain McCain

#Set MKVMerge.exe Path
$MKVMerge = 'C:\Program Files\MKVToolNix\mkvmerge.exe'
#Set Target
$Directory = "Z:\Films\"
#Set Subtitle Extension
$SubExtension = 'eng.srt'

#Process
$Subs = Get-ChildItem $Directory -Filter "*.$SubExtension" -Recurse | % { $_.FullName } | Sort-Object
$Count = $Subs.count
Write-Host "$Count MKV's to be processed."

Foreach ($Sub in $Subs) 
{
#Get File Name
$FormatName = $Sub.ToString()
$Name = $FormatName.TrimEnd(".$SubExtension")
$MKV = $Name + '.mkv'

#Set Output File Name
$Output = $Name + '___MERGED' + '.mkv'

#Execute
& $MKVMerge -o "$Output" --default-track "0" --language "0:eng" "$Sub" "$MKV"

#Clean Up
Remove-Item $MKV
Remove-Item $Sub
Rename-Item $Output -NewName $MKV
} 

答案4

以上所有代码的编辑均归功于 Ian McCain。

TrimEnd 是逐个字母而不是字符串进行处理,因此任何以扩展名中的字母结尾的文件都会导致失败。由于脚本不检查错误,因此即使发生阻止创建多路复用文件的错误,也会删除 sub 和 mkv 文件。这可能会导致数据丢失。

我需要使用脚本将 idx/sub 文件合并到我的 MKV 而不是 srt 文件中,并且它们的名称与视频文件相同,但扩展名为 .sub 和 .idx,而不是 .mkv。我还添加了错误检查,因此如果由于某些错误而未创建 ___MERGED 文件,则不会删除/重命名任何文件。这是我完成的解决方案。

    #Batch Merge Subtitles with MKVMerge - Iain McCain

#Set MKVMerge.exe Path
$MKVMerge = 'C:\Program Files\MKVToolNix\mkvmerge.exe'
#Set Target
$Directory = "Z:\Movies\"
#Set Subtitle Extension
$SubExtension = 'idx'
$SecondSubExtension = "sub"

#Process
$Subs = Get-ChildItem $Directory -Filter "*.$SubExtension" -Recurse | % { $_.FullName } | Sort-Object
$Count = $Subs.count
Write-Host "$Count MKV's to be processed."

Foreach ($Sub in $Subs) {
    #Get File Name
    $FormatName = $Sub.ToString()
    #$Name = $FormatName.TrimEnd(".$SubExtension")
    $Name = $FormatName.Substring(0,$FormatName.Length-($SubExtension.Length+1))
    $MKV = $Name + '.mkv'
    $OtherSub = $Name + '.' + $SecondSubExtension

    #Set Output File Name
    $Output = $Name + '___MERGED' + '.mkv'

    #Execute
    & $MKVMerge -o "$Output" --default-track "0" --language "0:eng" "$Sub" "$MKV"

    If (Test-Path $Output) {
        #Clean Up
        Remove-Item $MKV
        Remove-Item $Sub
        Remove-Item $OtherSub
        Rename-Item $Output -NewName $MKV
    } Else {
        write-host "NON-EXISTANT - $Output" -foreground "red"
        "NON-EXISTANT - $Output" | Out-File $Directory + "Errors.txt" -Append
    }
}

相关内容