Encontre todos os arquivos MKV e remova todas as legendas

5

Atualmente estou olhando para um programa do Windows chamado mkvmerge . Eu gostaria de criar um arquivo de lote para encontrar todos os arquivos MKV recursivamente de um caminho especificado e remover todas as legendas dos arquivos MKV encontrados (se o MKV encontrado contiver legendas), finalmente excluindo todos os arquivos MKV originais que tiveram as legendas removidas.

Eu fiz cerca de duas horas pesquisando, e estou achando que você tem que ser capaz de escrever coisas assim:

FOR /F "delims=*" %%A IN ('dir /b *.MKV') DO "C:\mkvmerge.exe" -o "fixed_%%A" -a 4 -s 7 --compression -1:none "%%A"

Ainda estou tentando, mas se alguém puder me ajudar, eu agradeço.

    
por David Custer 24.05.2013 / 10:51

2 respostas

8

Salve o seguinte como se fosse algo como DelMKVSubs.bat no mesmo diretório mkvmerge.exe , edite a variável rootfolder conforme seu requisitos e executar o arquivo em lotes:

@echo off
cls
set rootfolder=C:\
echo Enumerating all MKVs under %rootfolder%
echo.
for /r %rootfolder% %%a in (*.mkv) do (
    for /f %%b in ('mkvmerge -i "%%a" ^| find /c /i "subtitles"') do (
        if [%%b]==[0] (
            echo "%%a" has no subtitles
        ) else (
            echo.
            echo "%%a" has subtitles
            mkvmerge -q -o "%%~dpna (No Subs)%%~xa" -S "%%a"
            if errorlevel 1 (
                echo Warnings/errors generated during remuxing, original file not deleted
            ) else (
                del /f "%%a"
                echo Successfully remuxed to "%%~dpna (No Subs)%%~xa", original file deleted
            )
            echo.
        )
    )
)

O arquivo em lote deve ser fácil de entender, mas aqui está uma visão geral:

  1. Ele usa for /r para pesquisar recursivamente %rootfolder% para todos os MKVs

  2. Em seguida, ele executa mkvmerge -i em cada MKV para verificar se existe uma faixa de legenda

  3. Se o MKV não contiver faixas de legenda, ele executará mkvmerge -S para remodiar o arquivo enquanto ignora todas essas faixas

  4. Finalmente, ele verifica o código de saída do mkvmerge e se isso (ou seja, errorlevel ) for 0 indicando sucesso sem avisos / erros, ele exclui o arquivo original

Para mais informações, consulte a documentação do mkvmerge e também for /? , if /? etc. no prompt de comando.

    
por 24.05.2013 / 23:50
0

Obrigado, Karan, isso foi muito útil para mim também. Eu modifiquei o seu script para que você possa escolher um idioma (especificado por 3LC (eng, ned, swe etc.)) para as legendas que você gostaria de manter. Além disso, removi a parte em que os arquivos de entrada foram excluídos e optei por adicionar um sufixo ao arquivo de saída.

Aqui está minha versão:

:: remux all mkvs under a certain subfolder with all subitles
:: but those as specified by %language% parameter removed.

@echo off
setlocal enabledelayedexpansion

:: set your variables here
set rootfolder="C:\temp\New folder"
set language=eng
set suffix= (eng sub)

:: do the remuxing
echo Remuxing all mkvs in %rootfolder% and its subfolders.
for /r %rootfolder% %%a in (*.mkv) do (
    set subs=
    set mkv=%%a
    for /f "tokens=3 delims=: " %%b in ('mkvmerge -I "%%a" ^| findstr /i /r ".*subtitles.*language:%language%.*"') do (
        set subs=!subs!,%%b
    )
    for /f "tokens=*delims=," %%c in ("!subs!") do (
        set subs=%%c
    )
    if not exist "%%~dpna%suffix%%%~xa" if not "!subs!"=="" (
        mkvmerge -q -o "%%~dpna%suffix%%%~xa" -s !subs! "%%a"
        if errorlevel 1 (
            echo Warnings/errors generated during remuxing of "%%a".
        ) else (
            echo Successfully remuxed to "%%~dpna (eng subs)%%~xa".
        )
    ) else (
        echo Input file "%%a" has no subtitles in %language% or output file "%%~dpna%suffix%%%~xa" already exists. Skipping this file.
    )
)
pause
    
por 02.06.2014 / 13:55