Batch Converter .mkv para .mp4

10

Eu quero converter todos os arquivos .mkv em uma pasta em .mp4 com o VLC.

Ele deve usar o fluxo de vídeo / áudio original e, se possível, o subtítulo .ass do .mkv. Não é realmente uma conversão, é mais como alterar o contêiner - meu player não pode ler os vídeos MKV.

Se eu fizer esta conversão manualmente (manualmente) ele funciona, mas eu tenho muitos arquivos MKV para converter, então isso levaria muito tempo.

Eu procurei na internet por um arquivo de lote para fazer isso e encontrei alguns. Eu tentei modificá-los para o meu desejo, mas todas as tentativas que tentei apenas criaram um arquivo .mp4 que não contém o fluxo de áudio e o fluxo de vídeo também não pode ser processado por todos os meus media players no PC.

Alguém poderia me dizer como o lote tem que parecer, então funciona com o fluxo de áudio e vídeo original (e talvez com legendas)?

    
por IamHere 23.06.2012 / 17:05

3 respostas

12

mkvtomp4

Parece que mkvtomp4 é o que você quer?

Uses mpeg4ip or GPAC's MP4Box, mkvtoolnix and ffmpeg to convert troublesome mkv files to mp4. The conversion does not re-encode the video and only re-encodes the audio if it doesn't use AAC codec (one can override this behaviour using --audio-codec).

Você pode baixar versões do Windows e do Linux na página do Google Code. Você precisará de um software adicional.

Verifique os sites em busca de downloads para Windows ou Linux. No OS X, você precisa apenas de brew install mkvtoolnix mp4box se tiver Homebrew .

Isso não copiará suas legendas. Você precisará de um passo adicional.

FFmpeg batch

Se o mkvtomp4 não funcionar para você, um simples arquivo batch FFmpeg também pode ser usado. Para o Windows, você pode fazer o download das compilações do Zeranoe . No Linux, verifique o FFmpeg a partir de fontes de pacotes. No OS X, use brew install ffmpeg .

Então, basta ligar:

ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4

Isso criará um contêiner MP4 válido sem recodificação. Faça o loop sobre os arquivos, conforme necessário e disponível pelo sistema operacional. Este lote não copiará, no entanto, as legendas.

No * nix, você poderia fazer o seguinte. Basta criar um arquivo convert.sh :

#!/bin/bash
find /path/to/input/folder -iname '*.mkv' -print0 | while read -d '' -r file; do
    ffmpeg -i "$file" -c:v copy -c:a copy ${file%%.mkv}.mp4
done

Substitua o caminho para sua pasta de vídeos aqui. Torne-o executável com chmod +x convert.sh e, em seguida, execute-o com ./convert.sh .

No Windows, você provavelmente precisará de dois arquivos em lote ( plugue sem vergonha aqui ), sendo um deles startconvert.bat :

for %%i IN (*.mkv) DO (convert-to-mp4.bat "%%i") 
pause

E aquele que realiza a conversão:

IF EXIST "%1.mp4" GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -c:v copy -c:a copy %1.mp4

:exit 
@echo %1.mp4 already exists

Salve ambos na pasta de vídeos. Basta executar startconvert.bat da pasta da qual você deseja iniciar a conversão.

Legendas

Se você quiser adicionar as legendas, talvez seja necessário um procedimento manual, se o seguinte não funcionar para você:

ffmpeg -i input.mkv -c:a copy -c:v copy -map 0 output.mp4

Para extrair legendas, use:

mkvextract tracks input.mkv 3:subtitles.srt

Isto presume que o seu arquivo realmente contenha as legendas na ID 3 da faixa e elas podem ser exportadas para o formato SRT. Para verificar se um arquivo realmente contém legendas na faixa 3, use mkvmerge -i input.mkv .

Em seguida, use o MP4Box para adicionar novamente as legendas ao arquivo MP4.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4
    
por 23.06.2012 / 18:01
2

Este é um ajuste de parte da resposta que o slhck deu (e obrigado, slhck!) porque eu achei que o comando não funcionou para o último (neste momento) ffmpeg - talvez os parâmetros mudaram entre as versões? / p>

No Windows 7, usando ffmpeg v.20130103-git -9e36d9e-win64-static (descompacte-o com o utilitário 7zip), encontrado através do link por sua vez via link , o seguinte comando converteu um arquivo .mov (tirado de um iPhone) em um arquivo .mp4:

ffmpeg -i test.mov -vcodec copy -acodec copy test.mp4

Descobri que alterar a parte .mp4 deste para .avi também funcionava, para alterá-lo para um contêiner .avi. Com qualquer contêiner de destino, o uso desses parâmetros "-vcodec copy -acodec copy" parece copiar apenas os fluxos de origem em um novo contêiner (no destino), portanto, é uma conversão sem perdas (e acredito que seria o caso de um variedade de recipientes de destino, também).

Esses ajustes dos lotes que o slhck deu também funcionaram para mim:

callConvert.bat:

for %%i IN (*.mov) DO (convert.bat "%%i")
pause

convert.bat:

IF EXIST %1.mov GOTO exit

@echo Conversion for %1 started on %DATE% %TIME% 
ffmpeg -i %1 -vcodec copy -acodec copy %1.avi

:exit 
@echo %1.avi already exists
    
por 04.01.2013 / 12:33
0

Antiga pergunta, mas aqui está minha resposta, para o registro. O MP4 não pode fazer legendas a menos que elas façam parte do quadro de vídeo, mas é assim que eu converto os arquivos .mkv em .mp4:

foreach($inputFile in get-childitem -recurse -Filter *.mkv) {
    $outputFileName = [System.IO.Path]::GetFileNameWithoutExtension($inputFile.FullName) + ".mp4";
    $outputFileName = [System.IO.Path]::Combine($inputFile.DirectoryName, $outputFileName);

    $progDir = ${env:ProgramFiles(x86)};
    if ($progDir -eq $null) {
        $progDir = $env:ProgramFiles;
    }

    $processName = $progDir + "\VideoLAN\VLC\vlc.exe";
    $processArgs = "-I dummy -v '"$($inputFile.FullName)'" --sout=#transcode{}:standard{access='"file'",mux='"mp4'",dst='"$outputFileName'"} vlc://quit"

    start-process $processName $processArgs -wait
}

Salve-o como mkv2mp4.ps1 e solte-o na pasta em que você está trabalhando. Clique com o botão direito e "Abrir no Powershell" e ele fará o que quiser.

Esta é a primeira vez que eu olhei para o Powershell (e o último que eu espero - por que o MS não conseguiu portar o Bash ?!) mas funciona para mim e é baseado no código que eu encontrei aqui: link

    
por 10.10.2013 / 05:58