Conversão em lote .mkv para .mp4

10

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

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

Se eu fizer essa conversão manualmente (manualmente), ela funcionará, mas eu tenho muitos arquivos MKV para converter, então isso levaria muito tempo.

Pesquisei na Internet um arquivo em lotes para fazer isso e encontrei alguns. Tentei modificá-los conforme meu desejo, mas todas as tentativas que criei 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 renderizado por todos os meus players de mídia no PC.

Alguém poderia me dizer como o lote deve ser, para que ele funcione com o fluxo de áudio e vídeo original (e talvez com legendas .ass)?

Eu estou aqui
fonte
Em qual sistema operacional você está e precisa necessariamente usar o VLC? Além disso, o ISO MP4 não suporta legendas, pelo que me lembro - o que deve ser feito sobre elas?
slhck
para um teste que você pode tentar outro jogador (mplayer / KMPlayer / BSPlayer)
Remus Rigo
Travão de mão, isso é tudo.
Sam
O @Sam Handbrake recodificará os fluxos de vídeo e áudio, deixando-o com uma qualidade ruim. Além disso, é isso que o OP não queria especificamente.
usar o seguinte comando

Respostas:

13

mkvtomp4

Parece que mkvtomp4é o que você quer?

Usa mpeg4ip ou MP4Box do GPAC, mkvtoolnix e ffmpeg para converter arquivos mkv problemáticos em mp4 . A conversão não recodifica o vídeo e apenas recodifica o áudio se não usar o codec AAC (pode-se substituir esse comportamento usando --audio-codec).

Você pode baixar as versões do Windows e Linux na página de código do Google. Você precisará de software adicional.

Verifique os sites em busca de downloads para Windows ou Linux. No OS X, você só precisa brew install mkvtoolnix mp4boxse tiver o Homebrew .

Porém, isso não copiará suas legendas. Você precisará de uma etapa adicional.


Lote FFmpeg

Se o mkvtomp4 não funcionar, um arquivo em lote FFmpeg simples também poderá funcionar. Para Windows, você pode fazer o download das compilações do Zeranoe . No Linux, verifique o FFmpeg a partir das fontes do pacote. No OS X, use brew install ffmpeg.

Em seguida, basta ligar para:

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

Isso criará um contêiner MP4 válido sem recodificação. Passe os arquivos conforme necessário e disponível pelo seu sistema operacional. Este lote, no entanto, não copia legendas.

No * nix, você pode 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ídeo aqui. Torne-o executável com chmod +x convert.she execute-o com ./convert.sh.

No Windows, você provavelmente precisará de dois arquivos em lote ( plug descarado daqui ), 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ídeo. Basta executar a startconvert.batpartir da pasta da qual deseja iniciar a conversão.


Legendas

Se você deseja adicionar as legendas, pode ser 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

Isso pressupõe que seu arquivo realmente contém as legendas no número de identificação da faixa 3 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
slhck
fonte
Para o registro, testei o FFmpeg e a extração de legendas no OS X e funcionou perfeitamente.
slhck
Eu usei o ffmpeg para Windows. Mas existe um lote para que ele converta / mux automaticamente todos os arquivos da pasta para mp4 com o mesmo nome de arquivo? Ou talvez um lote que converte o arquivo em arrastar e soltar
2

Esta é uma pequena parte da resposta que o slhck deu (e obrigado, slhck!) Porque descobri que o comando não funcionava no ffmpeg mais recente (no momento em que escrevi) - talvez os parâmetros tenham mudado entre as versões?

No Windows 7, usando o ffmpeg v.20130103-git-9e36d9e-win64-static (descompacte-o com o utilitário 7zip), encontrado em http://ffmpeg.zeranoe.com/builds/, por sua vez, em http://ffmpeg.org /download.html , o seguinte comando converteu um arquivo .mov (retirado de um iPhone) em um arquivo .mp4:

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

Descobri que alterar a parte .mp4 disso para .avi também funcionava, para alterá-la para um contêiner .avi. Nos dois contêineres de destino, o uso desses parâmetros para "copiadores -vcodec-copiadores -codec" parece copiar apenas os fluxos de origem em um novo contêiner (no destino); portanto, é uma conversão sem perdas (e acho que seria o caso de um variedade de contêineres 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
r_alex_hall
fonte
1
Não há diferença entre -c:ae -acodec, ou -c:ve -vcodec. Na verdade, ainda estou usando o primeiro hoje, pois é a sintaxe recomendada, e ambos são mencionados na documentação do FFmpeg . Observe que a conversão do contêiner em AVI pode quebrar para muitos codecs de vídeo e áudio, pois os arquivos AVI não têm suporte para codificação preditiva (que o vídeo H.264 usa - aquele que o iPhone oferece). Se você não usar um contêiner MP4 ou MOV como destino, é sempre melhor recodificar.
slhck
"SE EXISTIR% 1.mov GOTO exit" deve ler "% 1.avi" (ou qualquer que seja o formato de destino, em vez do formato de origem), não? Fora isso, isso funcionou muito bem para mim, obrigado!
Kjsh
0

Pergunta antiga, mas aqui está a minha resposta, para constar. O MP4 não pode fazer legendas a menos que elas façam parte do quadro de vídeo, mas é assim que eu converto 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 com a qual você está trabalhando. Clique com o botão direito e "Abrir no PowerShell" e ele fará o que quiser.

Esta é a primeira vez que olhei para o Powershell (e a última espero - por que o MS não conseguiu apenas portar o Bash ?!), mas funciona para mim e é baseado no código que encontrei aqui: https: // wiki .videolan.org / How_to_Batch_Encode / # PowerShell

miken32
fonte
Qualquer que seja a linha de comando usada, você deve colocá-la dentro de um Makefile- para poder executá- la novamente e converter apenas as novas fontes, além de poder executar várias conversões em paralelo (para usar todas as suas CPUs) )
Mikhail T.