Fügen Sie mit ffmpeg Audio zu Video hinzu

23

Ich versuche, einem Video mit ffmpeg Sound hinzuzufügen, aber aus irgendeinem Grund ist beim Abspielen der resultierenden Datei kein Sound zu hören. Ich habe auch versucht, es mit einer AAC-Audiodatei zu machen, sowie -acodec copyes wegzulassen und eine WAV-Datei zu geben.

Hier ist die komplette Ausgabe:

C:\Users\SM-Audio\Desktop>ffmpeg -i PrintingCDs.mp4 -i AudioPrintCDs.mp3 -acodec
 copy -vcodec copy PrintCDs1.mp4
ffmpeg version N-48886-g5ce023b Copyright (c) 2000-2013 the FFmpeg developers
  built on Jan 14 2013 19:16:33 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libg
sm --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --e
nable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --e
nable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --en
able-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable
-libxavs --enable-libxvid --enable-zlib --enable-filter=frei0r
  libavutil      52. 14.100 / 52. 14.100
  libavcodec     54. 89.100 / 54. 89.100
  libavformat    54. 59.107 / 54. 59.107
  libavdevice    54.  3.102 / 54.  3.102
  libavfilter     3. 32.100 /  3. 32.100
  libswscale      2.  1.103 /  2.  1.103
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'PrintingCDs.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-05-01 13:35:52
  Duration: 00:02:35.57, start: 0.000000, bitrate: 585 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1024x
768 [SAR 1:1 DAR 4:3], 457 kb/s, 10 fps, 10 tbr, 30k tbn, 30 tbc
    Metadata:
      creation_time   : 2013-05-01 13:35:53
      handler_name    : Mainconcept MP4 Video Media Handler
    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 22050 Hz, mono, fltp, 126
kb/s
    Metadata:
      creation_time   : 2013-05-01 13:35:53
      handler_name    : Mainconcept MP4 Sound Media Handler
[mp3 @ 003dd6c0] max_analyze_duration 5000000 reached at 5015510 microseconds
Input #1, mp3, from 'AudioPrintCDs.mp3':
  Metadata:
    encoder         : Lavf54.59.107
  Duration: 00:02:36.21, start: 0.000000, bitrate: 64 kb/s
    Stream #1:0: Audio: mp3, 44100 Hz, mono, s16p, 64 kb/s
File 'PrintCDs1.mp4' already exists. Overwrite ? [y/N] y
Output #0, mp4, to 'PrintCDs1.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf54.59.107
    Stream #0:0(eng): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1024x768 [S
AR 1:1 DAR 4:3], q=2-31, 457 kb/s, 10 fps, 30k tbn, 30k tbc
    Metadata:
      creation_time   : 2013-05-01 13:35:53
      handler_name    : Mainconcept MP4 Video Media Handler
    Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 22050 Hz, mono, 126 k
b/s
    Metadata:
      creation_time   : 2013-05-01 13:35:53
      handler_name    : Mainconcept MP4 Sound Media Handler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 1555 fps=0.0 q=-1.0 Lsize=   11133kB time=00:02:35.57 bitrate= 586.2kbits
/s
video:8674kB audio:2408kB subtitle:0 global headers:0kB muxing overhead 0.459569
%
Arlen Beiler
quelle
Beachten Sie, dass der in Frage kommende Befehl völlig ausreicht, wenn Sie eine Nur-MP3-Video-Datei ohne eingebettete Audiospur mit einer separaten Nur-MP3-Audio-Datei zusammenführen.
Vadzim

Antworten:

44

Standardmäßig nimmt FFmpeg nur einen Audio- und einen Videostream auf. In Ihrem Fall wird dies nur aus der ersten Datei übernommen.

Sie müssen die Streams korrekt zuordnen:

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

Einige Notizen:

  • Die Optionen für die Ordnungszuordnung bestimmen, welche Streams von der Eingabe auf die Ausgabe abgebildet werden.
  • 0:v:0ist der erste Videostream der ersten Datei und 1:a:0der erste Audiostream der zweiten Datei. Das v/ aist nicht unbedingt erforderlich, aber falls Ihre Eingabedateien mehrere Streams enthalten, hilft dies, die Klärung zu erleichtern. Weitere Informationen zum Mapping finden Sie im FFmpeg-Wiki .
  • Wenn Ihr Audiostream länger ist als die Videodatei oder umgekehrt, können Sie die -shortestOption verwenden, dass ffmpeg die Konvertierung stoppt, wenn die kürzere der beiden endet.
  • -c copykopiert die Audio- und Videostreams. Dies bedeutet, dass der Prozess schnell und die Qualität gleich ist. Wenn Sie jedoch beispielsweise WAV-Audio zu einer vorhandenen Videodatei hinzufügen, ist es besser, dieses Audio zuerst zu komprimieren. Zum Beispiel:

    ffmpeg -i input.mp4 -i input.wav -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k output.mp4
    

    Hier kopieren wir nur den Videostream ( -c:v copy) und codieren den Audiostream mit dem in ffmpeg integrierten AAC-Encoder ( -c:a aac) mit 192 kBit / s neu.

  • Wenn Ihr Ausgabeformat einen bestimmten Codec nicht unterstützt (z. B. beim Hinzufügen von WAV zu MP4 oder AAC zu AVI usw.), ist auch eine Neucodierung erforderlich.
slhck
quelle
1
Vielen Dank, das funktioniert perfekt. Was ist das -c copy? Ist das eine Abkürzung für -acodec copy -vcodec copy?
Arlen Beiler
1
Ja, im Grunde sagt es, dass alle Arten von Streams kopiert werden sollen - dies schließt auch Untertitel ein.
Slhck
1
aus neugier was wenn die audio oder video länge nicht gleich sind! bleibt das Video gleich und die Audiolänge stimmt automatisch mit der Videogröße überein!
Akash Dubey
1
@Akash ffmpeg verwendet immer den längeren der beiden Streams und fügt am Ende schwarzes Video oder stummes Audio hinzu. Sofern Sie nicht die -shortestOption angeben , wird der Codierungsprozess in diesem Fall durch den kürzesten Stream beendet.
Slhck
1
@AkashDubey So benutzt du es, ja. Überall zwischen -i <input>und der Ausgabedatei.
Slhck
0

Verwenden Sie den folgenden Befehl, um die Videodateien mit verschiedenen Kodierungseinstellungen hinzuzufügen:

ffmpeg -i Gaslamp_4k_1.mp4 -i Grey.mp4 -filter_complex "[0:v:0] [1:v:0] concat=n=2:v=1 [v]" -map "[v]" output.mp4
Ashutosh Singla
quelle
Hey Ashu! Bei der Frage geht es darum, einem vorhandenen Videostream Audio hinzuzufügen, und nicht darum, zwei Videos zu verketten (was Ihr Befehl tut).
Slhck