Ajouter de l'audio à la vidéo à l'aide de FFmpeg

26

J'essaie d'ajouter du son à une vidéo en utilisant FFmpeg, mais pour une raison quelconque, lorsque je joue le fichier résultant, il n'a pas de son. J'ai également essayé de le faire avec un fichier audio aac, ainsi que de le laisser de côté -acodec copyet de lui donner un fichier wav.

Voici la sortie complète:

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
la source
Notez que la commande dans la question est complètement suffisante en cas de fusion d'un fichier vidéo mp4 uniquement sans piste audio intégrée avec un fichier audio mp4 séparé.
Vadzim

Réponses:

50

Par défaut, FFmpeg ne prendra qu'un seul flux audio et vidéo. Dans votre cas, cela provient uniquement du premier fichier.

Vous devez mapper les flux correctement:

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

Quelques notes:

  • Les options de mappage d'ordre déterminent quels flux de l'entrée sont mappés à la sortie.
  • 0:v:0est le premier flux vidéo du premier fichier et 1:a:0est le premier flux audio du deuxième fichier. Les v/ ane sont pas strictement nécessaires, mais dans le cas où vos fichiers d'entrée contiennent plusieurs flux, cela permet de lever l'ambiguïté. Plus d'informations sur la cartographie peuvent être trouvées sur le Wiki FFmpeg .
  • Si votre flux audio est plus long que le fichier vidéo, ou vice versa, vous pouvez utiliser l' -shortestoption pour que ffmpeg arrête la conversion lorsque la plus courte des deux se termine.
  • -c copycopie les flux audio et vidéo. Cela signifie que le processus sera rapide et que la qualité sera la même. Mais lorsque vous ajoutez, disons, de l'audio WAV à un fichier vidéo existant, il serait préférable de compresser cet audio en premier. Par exemple:

    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
    

    Ici, nous copions uniquement le flux vidéo ( -c:v copy) et ré-encodons le flux audio avec l'encodeur AAC intégré ffmpeg ( -c:a aac) à 192 kBit / s.

  • Si votre format de sortie ne prend pas en charge un codec particulier (par exemple, lors de l'ajout de WAV à MP4, ou AAC à AVI, etc.), un nouveau codage est également requis.
slhck
la source
1
Merci beaucoup, cela fonctionne parfaitement. C'est quoi -c copy? Est-ce un raccourci pour -acodec copy -vcodec copy?
Arlen Beiler
1
Oui, fondamentalement, il lui dit de copier toutes sortes de flux - cela inclut également les sous-titres.
slhck
1
par curiosité, si la durée audio ou vidéo n'est pas la même! la vidéo reste la même et la longueur audio correspond automatiquement à la taille de la vidéo!
Akash Dubey
1
@Akash ffmpeg utilisera toujours le plus long des deux flux et ajoutera de la vidéo noire ou du son silencieux à la fin. Sauf si vous spécifiez le-shortest option, auquel cas le flux le plus court met fin au processus d'encodage.
slhck
1
@AkashDubey C'est ainsi que vous l'utilisez, oui. N'importe où entre -i <input>et le fichier de sortie.
slhck