Wie entferne ich Audio-Streams aus einer MKV-Datei?

16

Ich habe versucht, nicht benötigte Audio-Streams aus einer MKV-Datei (Matroska) zu entfernen. Ich möchte dies tun, um zu vermeiden, dass Sie den gewünschten Stream in Windows Media Player manuell auswählen müssen.

Die Eingabedatei enthält die folgenden ffmpeg-Informationen:

Stream #0.0: Video: mpeg4, yuv420p, 704x396 [PAR 1:1 DAR 16:9], 29.98 tbr, 1k tbn, 29.98 tbc
Stream #0.1(eng): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.2(jpn): Audio: aac, 24000 Hz, 5.1, s16
Stream #0.3(eng): Subtitle: 0x0000
Stream #0.4(eng): Subtitle: 0x0000
Stream #0.5: Attachment: 0x0000
Stream #0.6: Attachment: 0x0000

Da ich die Streams 0, 1 und 3 (sub) haben möchte, sieht mein Befehl ffmpeg folgendermaßen aus:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:3 -vcodec copy -acodec libmp3lame -newsubtitle test.mkv

was seltsamerweise den Fehler gibt:

At least one output file must be specified

Untertitel entfernen:

ffmpeg -i input.mkv -map 0:0 -map 0:1 -vcodec copy -acodec libmp3lame test.mkv

gibt mir das:

Number of stream maps must match number of output streams

Ich verstehe anscheinend nicht wirklich, wie die Option "Karte" funktioniert. Würde mir jemand helfen, es herauszufinden?

StackedCrooked
quelle

Antworten:

25

Wenn Sie nur einen Stream entfernen und nicht neu codieren möchten, möchten Sie dies wahrscheinlich mit dem MKVtoolnix-Paket tun (siehe videohelp.com-Seite ).

Es gibt einige GUIs, die Ihnen helfen können (sehen Sie sich den Link zur Videohilfe an). Ich bin mir nicht sicher, wie die genaue mkvmergeBefehlszeile lauten könnte, aber ich denke, dass so etwas funktionieren würde:

# first, get audio track info so we know which one to keep
mkvmerge -i input.mkv
File 'input.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AAC)
Track ID 3: audio (A_AAC)        <----------- for example, let's keep this one
Track ID 4: audio (A_AAC)

mkvmerge -o output.mkv --atracks 3 input.mkv

Das sollte der Trick sein (ich habe keine Datei zum Testen parat, sorry). Die --atracksOption weist Sie mkvmergean, nur die aufgelisteten Audiospuren in die neue Datei zu kopieren . Wenn Sie 2 & 3 aber nicht 4 behalten möchten, können Sie verwenden --atracks 2,3.

mkvmergeEs gibt viele andere Optionen zum Einstellen von Titeln, zum Hinzufügen einer Verzögerung zum Synchronisieren von Audio usw .. Weitere Informationen finden Sie auf der Manpage .

Quacksalber
quelle
5
Es sieht so aus, als --atracksgäbe es keine Option mehr, stattdessen sollte man entweder --audio-tracksoder verwenden --video-tracks.
Malat
0

Versuchen Sie -f, das angegebene Format zu erzwingen:

ffmpeg -i input.mkv -map 0: 0 -map 0: 1 -map 0: 3 -vcodec copy -acodec libmp3lame -newsubtitle -f mkv test.mkv
John T
quelle
Das gibt mir seltsamerweise den Fehler: "Mindestens eine Ausgabedatei muss angegeben werden"
StackedCrooked
Versuchen Sie, einen vollständigen Pfad zu verwenden, z. B .: C: \ path \ to \ output.mkv (ich nehme an, Sie befinden sich auf Windows, wie in der Mediaplayer-Referenz angegeben)
John T.
@ John T: Bei Verwendung des vollständigen Pfads (mit oder ohne Anführungszeichen) erhalte ich weiterhin die Fehlermeldung "Mindestens eine Ausgabedatei muss angegeben werden".
StackedCrooked
0

Hier gibt es wirklich zwei verschiedene Probleme:

  1. In der ersten Befehlszeile ist die Reihenfolge der Parameter möglicherweise falsch. Ich denke, der -newaudioSchalter muss am Ende sein, nach dem Namen der Ausgabedatei.

  2. In der zweiten Befehlszeile, "Entfernen der Untertitel", müssen Sie die Untertitel mit dem -snSchalter entfernen , da die Eingabedatei Untertitel enthält . Ansonsten scheint FFmpeg mindestens eine Angabe in der -mapListe haben zu wollen.

user57355
quelle
0

In Ihrem ersten Befehl haben Sie nicht angegeben, dass test.mkv Ihre Ausgabedatei ist. Sieht so aus, als müssten Sie diesen Teil so ändern, dass er ... -c copy test.mkvdem Codec ähnelt oder ihn angibt ... -c:s copy test.mkv.

Und -newsubtitleich bin mir nicht sicher, was diese Flagge da drin macht. Wenn Sie jedoch eine Untertiteldatei haben, die Sie hinzufügen möchten, sollten Sie in der Lage sein, ein anderes Eingabe-Flag auszuführen -i input.srt. Siehe dazu diesen Link .

Bei Ihrem zweiten Befehl scheinen Sie zu versuchen, den Videostream zuzuordnen und zu kopieren. Vielleicht möchten Sie versuchen, die -vcodec copyAnweisung zu entfernen , und sie sollte einfach funktionieren. :)

Chefkoch Pharao
quelle
1
Es gibt keinen l Stream-Bezeichner .
Logan