批量合并/ mux .srt与.mkv文件


2

我有一个文件夹:

  • 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"

你能添加一行吗? 工作的 你想要执行的命令行?它可以帮助答案。
Hastur

你甚至可以选择你所选择的答案。 为什么投票很重要? ;-)
Hastur

Answers:


2
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文件中的默认语言/字幕


谢谢。这有效。但是它不会强制使用副标题。在你的帮助下,我添加了一些属性。 for %%A IN (*.mkv) do ( "B:\OneDrive\Portable applications\mkvtoolnix\mkvmerge.exe" -o "remux-%%~nxA" "%%~A" --forced-track "0:yes" --default-track "0:yes" --track-name "0:English" --language "0:eng" "%%~nA.srt" )
Arete

1

我在另一个答案中找到了一个好例子 [ 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 和所有选项在正确的地方。


1

我遇到了和你一样的问题,并将下面的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
} 

0

所有这些都归功于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
    }
}

0

非常感谢@ Ian,@ Haastur和其他人。这是一个脚本,用于纠正此处发布的其他错误,并将修改后的文件移回原始文件名。 (将“path”替换为可执行文件的路径)

for %%f in (*.mkv) do (
    echo %%~nf
    <path>mkvmerge.exe -o "%%~nf_New.mkv" "%%~nf.mkv" --language 0:eng "%%~nf.srt"
    move /Y "%%~nf_New.mkv"  "%%~nf.mkv"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.