web-dev-qa-db-ja.com

.mkvファイルを使用した.srtのバッチマージ/マルチプレクサ

私は次のフォルダを持っています:

  • TVShow-エピソード01.mkv
  • TVShow-エピソード01.srt
  • TVShow-エピソード02.mkv
  • TVShow-エピソード02.srt
  • TVShow-エピソード03.mkv
  • TVShow-エピソード03.srt

等々...

MKVMergeでこれを1つずつ実行できることはすでに知っています。これにはかなりの時間がかかるので... MKVToolNix、mkvmergeなどを使用してフォルダー内のすべてのファイルに対してこれを実行できるバッチスクリプトを作成したいと思います。

また、後でファイル名が異なる場合にスクリプトを適用できるように、バッチスクリプトを相対的なものにする必要があります。ファイル名は常に「TVShow」ではなく、「SecondTVShow」などです。

1。外部字幕ファイル(srt)をそれぞれのムービーファイル(mkv)に多重化したい。

2。また、字幕をそれぞれの映画ファイルのデフォルトの強制字幕にします。

このようなバッチスクリプトを作成するにはどうすればよいですか?私はバッチスクリプトについてある程度の知識があり、有用な情報を見つけることなく、これを数時間グーグルで検索しました。

私はこれから始めましたが、それは機能せず、字幕をデフォルトまたは強制に設定しません:

"B:\OneDrive\Portable applications\mkvtoolnix\mkvmerge.exe" "FOR %%A IN (*.mkv) DO mkvmerge -o "remux-%%~nA.mkv" "%%~A" "%%~dpnA.srt"
3
Arete
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ファイルのデフォルトの言語/字幕を変更する を参照してください。

3
Maher Fattouh

私はあなた自身と同じ問題を抱えていて、字幕のバッチ多重化を実現するために以下の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
} 
1
Iain McCain

私は別の答えで良い例を見つけます[ 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

put insideforサイクル、単一のケースで機能するコマンドライン、mkvファイルを%%~nf.mkvで、srtを%%~nf.srtで変更し、すべてのオプションを正しいものにするだけで十分です。場所。

1
Hastur

コードのこの編集については、上記のIanMcCainの功績によるものです。

TrimEndは文字列ではなく文字ごとであるため、拡張子名が文字で終わるファイルはすべて失敗します。スクリプトはエラーをチェックしないため、muxedファイルの作成を妨げるエラーが発生した場合でも、subファイルとmkvファイルは削除されます。これにより、データが失われる可能性があります。

スクリプトを使用して、srtファイルの代わりにidx/subファイルをMKVに多重化する必要がありました。これらの名前は、ビデオファイルと同じ名前で、拡張子は.mkvではなく.subと.idxです。また、エラーチェックを追加して、エラーが原因で___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
Johnathon S

@ Ian、@ Hasturなどに感謝します。これは、ここに投稿された他の間違いを修正し、変更されたファイルを元のファイル名に戻すスクリプトです。 (「パス」を実行可能ファイルへのパスに置き換えます)

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"

0
Sujay Phadke