web-dev-qa-db-fra.com

FFmpeg ne copie pas tous les flux audio

J'ai du mal à obtenir que ffmpeg copie tous les flux audio d'un fichier .mp4. Après des heures de recherche en ligne, il semble que cela devrait copier tous flux ( comme illustré dans l'exemple 4 ici ):

ffmpeg -i in.mp4 -map 0 -c copy out.mp4

in.mp4 contient 3 flux:

  • Vidéo
  • Piste audio 1
  • Piste audio 2

out.mp4 (qui devrait être identique à in.mp4) ne contient que 2 flux:

  • Vidéo
  • Piste audio 1

FFmpeg semble identifier correctement les 3 flux, mais ne les recopie pas tous. Sortie de FFmpeg:

Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (copy)

Modifier: Sortie de ffmpeg -v 9 -loglevel 99 -i in.mp4:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from in.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.36.100
  Duration: 00:00:06.03, start: 0.000000, bitrate: 5582 kb/s
    Stream #0:0(und), 1, 1/15360: Video: h264 (Main), 1 reference frame (avc1 /
0x31637661), yuv420p(tv, bt470bg/unknown/unknown, left), 1920x1080 (0x0) [SAR 1:
1 DAR 16:9], 0/1, 5317 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(und), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz,
 stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Successfully opened the file.
At least one output file must be specified
[AVIOContext @ 0000000001c2b9e0] Statistics: 153350 bytes read, 2 seeks

Edit 2 (résolu): J'ai réussi à trouver la syntaxe correcte dans ce ticket . Pour tous les autres intéressés, la syntaxe correcte est:

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0 out.mp4

Cela copiera tous les flux.

16
Dotl

Apparemment, c'est une question populaire, donc je poste ma solution comme réponse (était auparavant une réponse à un commentaire) pour que les autres puissent voir.

J'ai réussi à trouver la syntaxe correcte dans ce ticket . La syntaxe correcte est:

ffmpeg -i in.mp4 -vcodec copy -c:a copy -map 0:0 -map 0:1 -map 0:2 out.mp4

Cela copiera les 3 flux.

11
Dotl

FFmpeg a l'option de mapper tous les flux à la sortie, vous devez utiliser l'option -map 0 pour mapper tous les flux de l'entrée à la sortie.

En ligne complète, cela pourrait ressembler à:

ffmpeg -i in.mp4 -c copy -map 0 out.mp4

Pour plus d'informations, consultez la documentation sur sélection de flux et -map option.

14
PRIHLOP

J'ai d'abord essayé cette réponse plus large ici: https://stackoverflow.com/a/54616353/14226

Mais j'ai eu des problèmes avec une piste de sous-titres non prise en charge, j'ai donc dû utiliser cette commande:

avconv -i INFILE -c copy -map 0:a -map 0:v OUTFILE

Je comprends que, après avoir demandé à copier, il a essentiellement copié uniquement ce que j'ai mappé (et il a mappé tout l'audio bien sûr), car je ne le fais pas attention aux sous-titres intégrés. Si vous souhaitez mapper les sous-titres, ajoutez simplement ceci -map 0:s.

0
Aquarius Power

OK, j'ai lu assez profondément dans la page de manuel ffmpeg et j'ai trouvé ceci qui devrait être utile:

Notez qu'actuellement, chaque flux de sortie ne peut contenir que des canaux d'un seul flux d'entrée; vous ne pouvez pas par exemple utiliser "-map_channel" pour sélectionner plusieurs canaux audio d'entrée contenus dans différents flux (à partir du même fichier ou de fichiers différents) et les fusionner en un seul flux de sortie. Il n'est donc pas possible actuellement, par exemple, de transformer deux flux mono séparés en un seul flux stéréo. Cependant, il est possible de diviser un flux stéréo en deux flux mono à canal unique.

Si vous avez besoin de cette fonctionnalité, une solution de contournement possible consiste à utiliser le filtre amerge. Par exemple, si vous devez fusionner un média (ici input.mkv) avec 2 flux audio mono en un seul flux audio de canal stéréo (et conserver le flux vidéo), vous pouvez utiliser la commande suivante:

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

Vous voudrez peut-être lire et expérimenter les instructions de la page de manuel sur man ffmpeg-filters pour comprendre à quel niveau de complexité vous vous engagez pour nommer les canaux et la sortie attendue.

[Edit: Comme l'a noté Mulvya, cela répond à une question, mais ce n'était pas tout à fait la question de l'affiche originale.]

0
vielmetti