Batch Konvertieren Sie .mkv in .mp4

10

Ich möchte alle .mkv-Dateien in einem Ordner mit VLC stapelweise in .mp4 konvertieren.

Es sollte der ursprüngliche Video- / Audiostream und wenn möglich der Untertitel .ass der .mkv verwendet werden. Es ist nicht wirklich eine Konvertierung, es ist eher so, als würde man den Container wechseln - mein Player kann die MKV-Videos nicht lesen.

Wenn ich diese Konvertierung von Hand (manuell) durchführe, funktioniert sie, aber ich muss viele MKV-Dateien konvertieren, sodass dies viel Zeit in Anspruch nehmen würde.

Ich habe im Internet nach einer Batch-Datei gesucht und einige gefunden. Ich habe versucht, sie nach meinen Wünschen zu ändern, aber bei allen Versuchen, die ich versucht habe, wurde nur eine MP4-Datei erstellt, die den Audiostream nicht enthält, und der Videostream kann auch nicht von allen meinen Mediaplayern auf dem PC gerendert werden.

Könnte mir jemand sagen, wie der Stapel aussehen muss, damit er mit dem ursprünglichen Video- und Audiostream (und möglicherweise .ass Untertiteln) funktioniert?

Ich bin hier
quelle
Auf welchem ​​Betriebssystem arbeiten Sie und müssen Sie unbedingt VLC verwenden? Außerdem unterstützt ISO MP4, soweit ich mich erinnere, keine Untertitel - was ist dagegen zu tun?
Slhck
Für einen Test können Sie einen anderen Spieler (mplayer / KMPlayer / BSPlayer) ausprobieren
Remus Rigo
Handbremse, das ist alles.
Sam
@Sam Handbrake codiert die Video- und Audiostreams neu und hinterlässt daher eine schlechte Qualität. Auch das wollte das OP konkret nicht.
Slhck

Antworten:

13

mkvtomp4

Sieht aus wie mkvtomp4ist, was Sie wollen?

Verwendet mpeg4ip oder MP4Box, mkvtoolnix und ffmpeg von GPAC, um problematische mkv-Dateien in mp4 zu konvertieren . Bei der Konvertierung wird das Video nicht neu codiert und das Audio nur dann neu codiert, wenn kein AAC-Codec verwendet wird (dieses Verhalten kann mit --audio-codec überschrieben werden).

Sie können Windows- und Linux-Versionen auf der Google-Codepage herunterladen. Sie benötigen jedoch zusätzliche Software.

Überprüfen Sie die Websites auf Downloads für Windows oder Linux. Unter OS X müssen Sie nur, brew install mkvtoolnix mp4boxwenn Sie Homebrew haben .

Dadurch werden Ihre Untertitel jedoch nicht kopiert. Sie benötigen einen zusätzlichen Schritt.


FFmpeg Batch

Wenn mkvtomp4 für Sie nicht funktioniert, kann auch eine einfache FFmpeg- Batchdatei verwendet werden. Für Windows können Sie die Zeranoe-Builds herunterladen . Überprüfen Sie unter Linux FFmpeg aus Paketquellen. In OS X verwenden brew install ffmpeg.

Dann rufen Sie einfach an:

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

Dadurch wird ein gültiger MP4-Container ohne Neucodierung erstellt. Durchlaufen Sie die Dateien nach Bedarf und verfügbar von Ihrem Betriebssystem. Dieser Stapel kopiert jedoch keine Untertitel.

In * nix können Sie Folgendes tun. Erstellen Sie einfach eine Datei 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

Ersetzen Sie hier den Pfad zu Ihrem Videoordner. Machen Sie es ausführbar mit chmod +x convert.shund führen Sie es dann mit aus ./convert.sh.

In Windows benötigen Sie wahrscheinlich zwei Batch-Dateien ( schamloser Plug von hier ), eine davon startconvert.bat:

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

Und eine, die die Konvertierung durchführt:

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

Speichern Sie beide im Videoordner. Führen startconvert.batSie einfach den Ordner aus, aus dem Sie die Konvertierung starten möchten.


Untertitel

Wenn Sie die Untertitel hinzufügen möchten, benötigen Sie möglicherweise ein manuelles Verfahren, wenn Folgendes für Sie nicht funktioniert:

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

Verwenden Sie zum Extrahieren von Untertiteln:

mkvextract tracks input.mkv 3:subtitles.srt

Dies setzt voraus, dass Ihre Datei tatsächlich die Untertitel mit der Titel-ID Nummer 3 enthält und diese in das SRT-Format exportiert werden können. Verwenden Sie, um zu überprüfen, ob eine Datei tatsächlich Untertitel in Spur 3 enthält mkvmerge -i input.mkv.

Verwenden Sie dann MP4Box, um die Untertitel erneut zur MP4-Datei hinzuzufügen.

mp4box -add input.mp4 -add subtitles.srt -new output.mp4
slhck
quelle
Für die Aufzeichnung habe ich FFmpeg und die Untertitelextraktion unter OS X getestet und es hat einwandfrei funktioniert.
Slhck
Ich habe das ffmpeg für Windows verwendet. Aber gibt es einen Stapel, der automatisch alle Dateien im Ordner in mp4 mit demselben Dateinamen konvertiert / mux? Oder vielleicht ein Stapel, der die Datei per Drag & Drop
2

Dies ist eine Optimierung eines Teils der Antwort, die slhck gegeben hat (und danke, slhck!), Weil ich festgestellt habe, dass dieser Befehl für das neueste (zum jetzige Zeitpunkt) ffmpeg nicht funktioniert hat - vielleicht haben sich die Parameter zwischen den Versionen geändert?

Verwenden Sie unter Windows 7 ffmpeg v.20130103-git-9e36d9e-win64-static (dekomprimieren Sie es mit dem Dienstprogramm 7zip ), das über http://ffmpeg.zeranoe.com/builds/ wiederum über http://ffmpeg.org gefunden wird Mit /download.html konvertierte der folgende Befehl eine .mov-Datei (von einem iPhone übernommen) in eine .mp4-Datei:

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

Ich fand, dass das Ändern des .mp4-Teils in .avi auch funktionierte, um es in einen .avi-Container zu ändern. Bei beiden Zielcontainern scheinen die Parameter "-vcodec copy -acodec copy" nur die Quelldatenströme in einen neuen Container (im Ziel) zu kopieren, sodass die Konvertierung verlustfrei ist (und ich vermute, dass dies bei a der Fall ist auch verschiedene Zielbehälter).

Diese Verbesserungen der Chargen, die slhck gegeben hat, haben auch bei mir funktioniert:

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
quelle
1
Es gibt keinen Unterschied zwischen -c:aund -acodec, oder -c:vund -vcodec. Tatsächlich verwende ich heute noch die erstere, da dies die empfohlene Syntax ist und beide in der FFmpeg-Dokumentation erwähnt werden . Beachten Sie, dass die Konvertierung des Containers in AVI für viele Video- und Audio-Codecs möglicherweise nicht funktioniert, da AVI-Dateien keine Unterstützung für die Vorhersagecodierung bieten (die von H.264-Videos verwendet wird - die, die Ihnen das iPhone bietet). Wenn Sie keinen MP4- oder MOV-Container als Ziel verwenden, ist es immer besser, neu zu codieren.
Slhck
"WENN EXIST% 1.mov GOTO exit" sollte stattdessen "% 1.avi" (oder was auch immer das Zielformat anstelle des Quellformats ist) lauten, nein? Davon abgesehen hat das bei mir super funktioniert, danke!
Kjosh
0

Alte Frage, aber hier ist meine Antwort. MP4 kann keine Untertitel erstellen, es sei denn, sie sind Teil des Videorahmens. Auf diese Weise konvertiere ich .mkv-Dateien 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
}

Speichern Sie es als mkv2mp4.ps1 und legen Sie es in dem Ordner ab, mit dem Sie arbeiten. Rechtsklick und "In Powershell öffnen" und es wird seine Sache tun.

Dies ist das erste Mal, dass ich mir Powershell anschaue (und das letzte Mal, dass ich hoffe - warum konnte MS Bash nicht einfach portieren?!), Aber es funktioniert für mich und basiert auf dem Code, den ich hier gefunden habe: https: // wiki .videolan.org / How_to_Batch_Encode / # Powershell

miken32
quelle
Unabhängig davon, welche Befehlszeile Sie verwenden, sollten Sie sie in eine Makefile- einfügen, um sie erneut ausführen und nur die neuen Quellen konvertieren zu können sowie um mehrere Konvertierungen parallel ausführen zu können (um alle Ihre CPUs zu nutzen) ).
Mikhail T.