FFMPEG Mux Video und Audio (von einem anderen Video) - Mapping-Problem

81

Ich möchte das Audio von einem Video zu einem anderen Video ohne Audio (in einem Befehl) platzieren:

ffmpeg.exe -i video1_noAudio.mov -i video2_wAudio.mov -vcodec copy -acodec copy video1_audioFromVideo2.mov

Ich denke, "-map" ist der richtige Weg, aber ich wurde damit verwechselt.

Können Sie vorschlagen, wie Sie das Problem beheben können?

Kennzeichen
quelle

Antworten:

219

Übersicht der Eingänge

input_0.mp4hat den gewünschten Videostream und input_1.mp4hat den gewünschten Audiostream:

Mapping-Diagramm

In ffmpegden Streams sieht das so aus:

$ ffmpeg -i input_0.mp4 -i input_1.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input_0.mp4':
  Duration: 00:01:48.50, start: 0.000000, bitrate: 4144 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 4014 kb/s, SAR 115:87 DAR 1840:783, 23.98 fps, 23.98 tbr, 16k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 124 kb/s (default)

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'input_1.mp4':
  Duration: 00:00:30.05, start: 0.000000, bitrate: 1754 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 8:9 DAR 4:3], 1687 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
    Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 55 kb/s (default)

ID-Nummern

ffmpegbezieht sich auf Eingabedateien und Streams mit Indexnummern. Das Format ist input_file_id:input_stream_id. Da ffmpegdie Zählung ab 0 beginnt, 1:1bezieht sich der Stream auf das Audio von input_1.mp4.

Stream-Spezifizierer

Dies kann mit Stream-Spezifizierern erweitert werden . Beispielsweise können Sie feststellen, ffmpegdass Sie den ersten Videostream vom ersten Eingang ( 0:v:0) und den ersten Audiostream vom zweiten Eingang ( 1:a:0) möchten . Ich bevorzuge diese Methode, weil sie effizienter ist. Außerdem ist es weniger anfällig für versehentliches Mapping, da 1:1es sich auf jeden Stream-Typ beziehen kann, während es sich 2:v:3nur auf den vierten Videostream der dritten Eingabedatei bezieht.

Beispiele

Die -mapOption gibt an, ffmpegwelche Streams Sie möchten. So kopieren Sie das Video von input_0.mp4und Audio von input_1.mp4:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:0 -map 1:1 -shortest out.mp4

Das nächste Beispiel macht dasselbe:

$ ffmpeg -i input_0.mp4 -i input_1.mp4 -c copy -map 0:v:0 -map 1:a:0 -shortest out.mp4
  • -map 0:v:0kann übersetzt werden als: Wählen Sie am ersten Eingang ( 0) den Videostream-Typ ( v), den ersten Videostream ( 0).

  • -map 1:a:0kann übersetzt werden als: Wählen Sie am zweiten Eingang ( 1) den Audio-Stream-Typ ( a), den ersten Audio-Stream ( 0).

Zusätzliche Bemerkungen

  • Mit -c copyden Streams werden Streams kopiert , nicht neu codiert, so dass es keinen Qualitätsverlust gibt. Wenn Sie neu codieren möchten, lesen Sie FFmpeg Wiki: H.264 Encoding Guide .

  • Die -shortestOption bewirkt, dass die Ausgabedauer mit der Dauer des kürzesten Eingabestreams übereinstimmt.

  • Siehe die -mapOption Dokumentation für weitere Informationen.

llogan
quelle
16
Upvoted, weil dies die beste Beschreibung + das beste Beispiel ist, das ich gefunden habe, um stundenlang genau das zu tun.
Mark Ping
4
Vielen Dank, dass Sie es nicht nur gelöst, sondern auch erklärt haben!
Mathias
1
Diese Erklärung ist perfekt für -map Anfänger
seed_87
2
@FernandoEspinosa Die Bearbeitung ist tatsächlich falsch. -map 1:0würde das Video von beziehen input_1.mp4, nicht das Audio. Das Beispiel sollte das Audio erhalten, also muss es sein -map 1:1oder -map 1:a:0was in diesem Fall dazu führt, dass der gewünschte Audiostream abgerufen wird. Beziehen Sie sich auf das Bild in der Antwort für eine visuelle Darstellung.
llogan
1

Ich habe einen neuen Befehl zum Zusammenführen von Audio zu Video

ffmpeg -i video.mp4 -i audio.mp4 -map 0.0 -map 1.0 -acodec copy -qscale 4 -vcodec mpeg4 outvideo.mp4

-qscale ist die Option, die Qualität auf Video von ffmpeg einzustellen

-acodec copy ist die Option zum Kopieren der Standardqualität von Audio zur Videoausgabe

-vcodec mpeg4 ist die Option zum Kopieren der Standardqualität von Videos zur Videoausgabe

HoangHieu
quelle
1
-vcodecist schon immer da. Es ist das gleiche wie die neueren Aliase -codec:vund -c:v.
Llogan
@HoangHieu Kann ich MP3-Video WAV-Audio hinzufügen? Ich habe ffmpeg -i 1.mp4 -i 0.wav -map 0 -map 1 -codec copy -shortest new.mp4den Befehl versucht, aber nicht funktioniert
Allan
?? dein Befehl. 0.0 nicht 0 , 1.0 nicht 1 - 1.0 es bedeutet: Index [1] Kanal [0] ... - Acodec-Kopie nicht- Codec-Kopie , es bedeutet Kopie Audio-Codec
HoangHieu
Sie möchten wahrscheinlich -vcodec copyvermeiden, das Video neu zu codieren
Wolfd
0

Als MKV-spezifische ergänzende Antwort:

MKVToolnix kann das. Ich bevorzuge die GUI.

Wenn das erste Video hinzugefügt wurde, fügen Sie das zweite hinzu ("Quelldateien hinzufügen"), lassen Sie dann nur die gewünschten Streams ausgewählt und drücken Sie "Multiplexing starten".

Geben Sie hier die Bildbeschreibung ein

Cipricus
quelle