Converti in batch .mkv in .mp4


10

Voglio convertire in batch tutti i file .mkv in una cartella in .mp4 con VLC.

Dovrebbe utilizzare il flusso video / audio originale e, se possibile, il sottotitolo .ass di .mkv. Non è proprio una conversione, è più come cambiare il contenitore - il mio lettore non è in grado di leggere i video MKV.

Se eseguo questa conversione a mano (manualmente) funziona, ma ho molti file MKV da convertire, quindi ci vorrebbe molto tempo.

Ho cercato su Internet un file batch per farlo e ne ho trovati alcuni. Ho provato a modificarli secondo i miei desideri, ma tutti i tentativi che ho provato hanno appena creato un file .mp4 che non contiene il flusso audio e il flusso video non può essere eseguito da tutti i miei lettori multimediali sul PC.

Qualcuno potrebbe dirmi come deve essere il batch, quindi funziona con il flusso audio e video originale (e forse i sottotitoli .ass)?


Su quale sistema operativo utilizzi e devi necessariamente utilizzare VLC? Inoltre, ISO MP4 non supporta i sottotitoli per quanto mi ricordo: cosa si dovrebbe fare al riguardo?
slhck,

per un test puoi provare un altro giocatore (mplayer / KMPlayer / BSPlayer)
Remus Rigo,

Freno a mano, tutto qui.
Sam

Il freno a mano @Sam ricodificherà i flussi video e audio, risultando in una cattiva qualità. Inoltre, questo è ciò che l'OP specificamente non voleva.
Slhck,

Risposte:


13

mkvtomp4

Sembra che mkvtomp4sia quello che vuoi?

Utilizza mpeg4ip o MP4Box di GPAC, mkvtoolnix e ffmpeg per convertire fastidiosi file mkv in mp4 . La conversione non ricodifica il video e ricodifica l'audio solo se non utilizza il codec AAC (è possibile ignorare questo comportamento utilizzando --audio-codec).

Puoi scaricare le versioni di Windows e Linux nella pagina del codice di Google. Avrai bisogno di software aggiuntivo però.

Controllare i siti per i download per Windows o Linux. Su OS X, è necessario solo brew install mkvtoolnix mp4boxse si dispone di Homebrew .

Questo non copierà i tuoi sottotitoli. Avrai bisogno di un passaggio aggiuntivo.


Lotto FFmpeg

Se mkvtomp4 non funziona per te, potrebbe anche fare un semplice file batch FFmpeg . Per Windows, puoi scaricare le build di Zeranoe . In Linux, controlla FFmpeg dai sorgenti del pacchetto. In OS X, utilizzare brew install ffmpeg.

Quindi, basta chiamare:

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

Ciò creerà un contenitore MP4 valido senza ricodifica. Scorri i file secondo necessità e disponibili nel tuo sistema operativo. Questo batch, tuttavia, non copia i sottotitoli.

In * nix, è possibile effettuare le seguenti operazioni. Basta creare un file 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

Sostituisci qui il percorso della tua cartella video. Renderlo eseguibile con chmod +x convert.sh, quindi eseguirlo con ./convert.sh.

In Windows, probabilmente hai bisogno di due file Batch ( plug spudorato da qui ), uno dei quali startconvert.bat:

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

E uno che esegue la conversione:

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

Salva entrambi nella cartella video. Esegui semplicemente startconvert.batdalla cartella da cui desideri iniziare la conversione.


Sottotitoli

Se vuoi aggiungere i sottotitoli, potresti aver bisogno di una procedura manuale se quanto segue non funziona per te:

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

Per estrarre i sottotitoli, utilizzare:

mkvextract tracks input.mkv 3:subtitles.srt

Ciò presuppone che il file contenga davvero i sottotitoli nell'ID traccia numero 3 e che possano essere esportati nel formato SRT. Per verificare se un file contiene davvero i sottotitoli nella traccia 3, utilizzare mkvmerge -i input.mkv.

Quindi, utilizzare MP4Box per aggiungere nuovamente i sottotitoli al file MP4.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4

Per la cronaca, ho testato FFmpeg e l'estrazione dei sottotitoli su OS X e ha funzionato perfettamente.
slhck,

Ho usato ffmpeg per Windows. Ma c'è un batch, quindi converte / mux automaticamente tutti i file nella cartella in mp4 con lo stesso nome file? O forse un batch che converte il file al trascinamento della selezione

2

Questa è una modifica della parte della risposta che slhck ha dato (e grazie, slhck!) Perché ho scoperto che il comando non ha funzionato per l'ultimo (in questa scrittura) ffmpeg - forse i parametri sono cambiati tra le versioni?

Su Windows 7, usando ffmpeg v.20130103-git-9e36d9e-win64-static (decomprimilo con l'utilità 7zip), reperibile tramite http://ffmpeg.zeranoe.com/builds/ a sua volta tramite http://ffmpeg.org /download.html , il seguente comando ha convertito un file .mov (prelevato da un iPhone) in un file .mp4:

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

Ho scoperto che anche cambiare la parte .mp4 di questo in .avi ha funzionato, per cambiarlo in un contenitore .avi. Con entrambi i contenitori di destinazione, l'utilizzo di questi parametri "-vcodec copy -acodec copy" sembra copiare solo i flussi di origine in un nuovo contenitore (nella destinazione), quindi è una conversione senza perdita (e suppongo che sarebbe il caso di un varietà di contenitori target, anche).

Queste modifiche apportate a batch da Slhck hanno funzionato anche per me:

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

1
Non c'è differenza tra -c:ae -acodec, o -c:ve -vcodec. In effetti sto ancora usando il primo oggi, poiché è la sintassi consigliata, ed entrambi sono menzionati nella documentazione di FFmpeg . Tieni presente che la conversione del contenitore in AVI potrebbe interrompersi per molti codec video e audio, poiché i file AVI non supportano la codifica predittiva (utilizzata dal video H.264, quella che ti offre l'iPhone). Se non si utilizza un contenitore MP4 o MOV come destinazione, è sempre meglio ricodificare.
Slhck,

"IF EXIST% 1.mov GOTO exit" dovrebbe invece contenere "% 1.avi" (o qualunque sia il formato di destinazione, anziché il formato di origine), no? A parte questo, ha funzionato benissimo per me, grazie!
kjosh,

0

Vecchia domanda, ma ecco la mia risposta, per la cronaca. MP4 non può fare i sottotitoli a meno che non facciano parte del frame video, ma è così che converto i file .mkv in .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
}

Salvalo come mkv2mp4.ps1 e rilascialo nella cartella con cui stai lavorando. Fare clic destro e "Apri in Powershell" e farà la sua cosa.

Questa è la prima volta che guardo anche Powershell (e l'ultima spero - perché MS non ha potuto semplicemente portare Bash ?!) ma funziona per me e si basa sul codice che ho trovato qui: https: // wiki .videolan.org / How_to_Batch_Encode / # PowerShell


Qualunque sia la riga di comando che usi, dovresti inserirla in un Makefile- per essere in grado di rieseguirla e convertire solo le nuove fonti, oltre a poter eseguire più conversioni in parallelo (per utilizzare tutte le tue CPU ).
Mikhail T.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.