Agregue audio al video usando FFmpeg

26

Estoy tratando de agregar sonido a un video usando FFmpeg, pero por alguna razón, cuando reproduzco el archivo resultante, no tiene ningún sonido. También intenté hacerlo con un archivo de audio aac, así como omitirlo -acodec copyy darle un archivo wav.

Aquí está la salida completa:

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
fuente
Tenga en cuenta que el comando en la pregunta es completamente suficiente en caso de fusionar un archivo solo de video mp4 sin pista de audio incrustado con un archivo de audio mp4 separado.
Vadzim

Respuestas:

50

Por defecto, FFmpeg solo tomará una transmisión de audio y una de video. En su caso, esto se toma solo del primer archivo.

Necesita mapear las transmisiones correctamente:

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

Algunas notas:

  • Las opciones de asignación de orden determinan qué secuencias de la entrada se asignan a la salida.
  • 0:v:0es la primera secuencia de video del primer archivo y 1:a:0es la primera secuencia de audio del segundo archivo. Los v/ ano son estrictamente necesarios, pero en caso de que sus archivos de entrada contengan múltiples flujos, eso ayuda a desambiguar. Puede encontrar más información sobre el mapeo en el Wiki de FFmpeg .
  • Si su transmisión de audio es más larga que el archivo de video, o viceversa, puede usar la -shortestopción para que ffmpeg detenga la conversión cuando finalice el más corto de los dos.
  • -c copycopia las transmisiones de audio y video. Esto significa que el proceso será rápido y la calidad será la misma. Pero al agregar, digamos, audio WAV a un archivo de video existente, sería mejor comprimir ese audio primero. Por ejemplo:

    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
    

    Aquí, solo copiamos la transmisión de video ( -c:v copy) y volvemos a codificar la transmisión de audio con el codificador AAC incorporado ffmpeg ( -c:a aac) a 192 kBit / s.

  • Si su formato de salida no es compatible con un códec particular (por ejemplo, al agregar WAV a MP4, o AAC a AVI, etc.), también se requiere una nueva codificación.
slhck
fuente
1
Muchas gracias, eso funciona perfecto. ¿Qué es el -c copy? ¿Es esa taquigrafía para -acodec copy -vcodec copy?
Arlen Beiler
1
Sí, básicamente le dice que copie todo tipo de transmisiones, esto también incluye subtítulos.
slhck
1
Por curiosidad, ¿qué pasa si la duración del audio o del video no es la misma? ¿el video permanece igual y la duración del audio coincide automáticamente con el tamaño del video!
Akash Dubey
1
@Akash ffmpeg siempre usará la más larga de las dos transmisiones y agregará video negro o audio silencioso al final. A menos que especifique la -shortestopción, en cuyo caso la secuencia más corta termina el proceso de codificación.
slhck
1
@AkashDubey Así es como lo usas, sí. En cualquier lugar entre -i <input>y el archivo de salida.
slhck