Batch merge / mux .srt com arquivos .mkv

2

Eu tenho uma pasta com:

  • TVShow - Episódio 01.mkv
  • TVShow - Episódio 01.srt
  • TVShow - Episódio 02.mkv
  • TVShow - Episódio 02.srt
  • TVShow - Episódio 03.mkv
  • TVShow - Episódio 03.srt

e assim por diante ...

Eu já sei que posso fazer isso com o MKVMerge um por um. Isso levaria uma quantidade considerável de tempo, então ... Eu quero fazer um script em lote que pode fazer isso para todos os arquivos na pasta com MKVToolNix, mkvmerge ou similar.

Eu também preciso que o script em lote seja relativo para que eu possa aplicar o script posteriormente quando os nomes dos arquivos forem diferentes. O nome do arquivo pode não ser "TVShow", por exemplo, "Second TV Show".

1. Eu quero mux o arquivo de legenda externa (srt) no respectivo arquivo de filme (mkv).

2. Eu também quero tornar a legenda a legenda padrão e forçada do respectivo arquivo de filme.

Como posso fazer um script em lote como este? Eu tenho algum conhecimento de scripts em lote e eu pesquisei isso por algumas horas sem encontrar nenhuma informação útil.

Eu comecei com isso, mas ele não funciona e também não define as legendas como padrão ou forçado:

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

5 respostas

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!
)

E veja mkvpropedit - Modifique as propriedades de Matroska existentes e Alterar idioma / legendas padrão em arquivos MKV

    
por 04.02.2016 / 12:36
1

Eu acho um bom exemplo em outra resposta [ 1 ] , use o esboço geral abaixo:

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

)

O exemplo mais semelhante que encontrei no site do 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

É suficiente que você insira o ciclo for , a linha de comando que funciona no seu caso individual, alterando o arquivo mkv com %%~nf.mkv e o srt com %%~nf.srt e todos os opções no lugar correto.

    
por 04.02.2016 / 12:39
1

Eu tive o mesmo problema que você e juntei o Script PowerShell abaixo para obter o lote de legendas.

#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
} 
    
por 26.06.2016 / 10:18
0

Todo o crédito a Ian McCain acima para esta edição do seu código.

TrimEnd é letra por letra em vez de strings, portanto, qualquer arquivo que termine com uma letra no nome da extensão causará falhas. Como o script não verifica erros, os arquivos sub e mkv são excluídos mesmo que ocorram erros que impeçam a criação do muxed. Isso pode causar perda de dados.

Eu precisava usar o script para os arquivos mux idx / sub em meus arquivos MKVs em vez de srt, e eles têm o mesmo nome do arquivo de vídeo com uma extensão .sub e .idx em vez de .mkv. Também adicionei a verificação de erros para que nenhum arquivo seja excluído / renomeado se o arquivo

por 13.09.2017 / 06:55
0

Muito obrigado a @Ian, @Hastur e outros. Aqui está um script que corrige os erros nos outros postados aqui e move o arquivo modificado de volta para o nome do arquivo original. (substitua "caminho" pelo caminho para o executável)

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"

    
por 14.02.2018 / 21:04