
Ich versuche, Video/Audio aus einem MKV-Container in MP4 zu kopieren. Beim Ausführen ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4
wird mir kein Video mit polnischem Ton angezeigt. Es gibt nur einen Videostream, Stream Nr. 0:0. Stream Nr. 0:1 ist polnischer Ton, Nr. 0:2 Englisch und Nr. 0:3 - Nr. 0:5 sind Untertitel.
ich leseFFmpeg Wiki: Karteaber ich verstehe es nicht wirklich. Warum steht -map 0:1
es in Beispiel 1 zweimal? Was macht -c:s
es? Wie würde ein Befehl aussehen, um #0:0 in Video und #0:2 in Audio zu kopieren?
Antwort1
-map <inputNo>:<streamNo>
weist ffmpeg an, den Stream zu übernehmenstreamNeinvom EingangEingabeNrund es der Ausgabe hinzuzufügen, wobei <inputNo>
es mit 0 beginnt.
Manchmal möchten Sie denselben Eingabestream zweimal verwenden (wie -map 0:1 -map 0:1
im Beispiel), da Sie jeden mit unterschiedlichen Codecs/Parametern codieren können. Im Beispiel enthält die Ausgabe denselben Audiostream zweimal, einmal in MP3 und einmal in AAC.
Standardmäßig (also ohne -map
Befehl) wird ein Video-, ein Audio- und ein Untertitel-Stream von den Eingängen genommen. Wenn Sie alle Streams von einem Eingang zuordnen möchten, verwenden Sie -map <inputNo>
.
Dass du mit deinem Befehl kein Video bekommst, kann nur eines bedeuten: deine Videospur ist mit einem Codec codiert, der in MKV, aber nicht in MP4 gemultiplext werden kann. Sie wird also automatisch verworfen. Kannst du ein Protokoll posten, ffmpeg -i input.mkv
damit wir prüfen können, mit welchen Codecs die Spuren codiert sind?
Schließlich -c:s
wird der Codec für Untertitel verwendet (während -c:a
er für Audio und -c:v
Video verwendet wird).
Antwort2
Dies war das Beispiel, das mir das Verständnis ermöglichte. Stellen Sie sich den folgenden Befehl vor:
ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv
Und so führt ffmpeg die Zuordnung durch:
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)
Was ist passiert?
Im Befehl haben wir nur eine Eingabe: tears_of_steel.mkv. Deshalb beginnen alle unsere Karten mit #0:...
Dann schreiben wir eine erste Map-Option: -map 0:0, die sich auf den ersten Stream unserer Eingabe (tears_of_steel.mkv) bezieht, der möglicherweise ein Videostream ist, aber das spielt keine Rolle.
Da es die erste Zuordnungsoption ist, wird sie dem ersten Stream in unserer Ausgabedatei (tears_of_steel-v2.mkv) zugeordnet.
Dann schreiben wir eine zweite Map-Option: -map 0:2, die sich auf den dritten Stream unserer Eingabe bezieht. Da es sich um die zweite Map-Option handelt, wird sie in unserer Ausgabe dem zweiten Stream zugeordnet.
Und so weiter...
Ich habe das auf meinem Github geschrieben:https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md
Antwort3
So funktionieren die Optionen -c
(Codecs auswählen) und -map
(Streams auswählen):
-c:a -> select first or best supported audio (transcoded)
-c:a copy -> best supported audio (copied)
-map 0:a -> all audio from 1st input file (transcoded)
-map 1:a:0 -> 1st audio stream from 2nd input file (transcoded)
-map 1:a:1 -c:a copy -> 2nd audio stream from 2nd input file (copied)
So kopieren Sie alle Untertitel-Streams aus der ersten Eingabedatei ohne Transkodierung:
-map 0:s -c:s copy
Ihre Ausgabedatei ist im MP4- und die Eingabedatei im MKV-Format und Sie haben sich für eine Videoausgabe ohne Transkodierung ( -c:v copy
) in ein kompatibles Format für MP4 entschieden, sodass Sie am Ende eine MP4-Datei ohne (abspielbares) Video erhalten.
Geben Sie entweder einen Video-Encoder an, der mit MP4 kompatibel ist, z. B. -c:v libx264
statt -c:v copy
oder lassen Sie das Feld leer (d. h. erwähnen Sie keinen Encoder und ffmpeg).Die ausgewählten Encoder sind die Standardencoder, die für jedes Ausgabeformat registriert sind.)
Wenn Sie das Video nicht transkodieren möchten (da dies sehr lange dauern kann), kopieren Sie den Videostream in denselben Container, wählen Sie aber das gewünschte Audio aus, z. B. mkv. So erhalten Sie eine MP4-Datei mit transkodiertem Video und ausgewähltem Audio:
ffmpeg -i input.mkv -map 0:0 -c:v libx264 -map 0:2 -c:a copy output.mp4
Antwort4
Dies ist eine einfache Antwort für Leute wie mich, die einfache Erklärungen mögen. Dies ist eine Lösung, wenn Sie MKV in MP4 kopieren undAudio-Streams auswählen:
Du musst schreiben-map 0:AnzahlderStreamsminuseinsvor -c:eine Kopie
Nehmen wir an, das Video hat 3 Streams (das können Sie in den Medieninformationen sehen). Der erste Stream ist Video, der zweite ist Standard-Audio und der dritte ist Nicht-Standard-Audio in der gewünschten Sprache. Sie müssen also -map 0:2 schreiben, NICHT -map 0:3
Außerdem müssen Sie schreiben-map 0:0 vor -c:v Kopiedenn wenn Sie das nicht tun, kopiert ffmpeg den Videostream nicht und Sie erhalten nur den Audiostream (Wenn das Video zwei Videostreams hat und Sie den zweiten kopieren möchten, müssen Sie -map 0:1 schreiben)
Also dasletzte Befehlszeilesieht aus wie das:
ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"
In diesem Fall erhalten Sie den ersten Videostream und den dritten Audiostream
Ein anderes Beispiel:
ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"
In diesem Fall sollten Sie den zweiten Videostream und den siebten Audiostream erhalten
ich hoffe das hilft