web-dev-qa-db-fra.com

ffmpeg: Combiner / fusionner plusieurs vidéos mp4 ne fonctionne pas, la sortie ne contient que la première vidéo

Voici la commande que j'utilise pour combiner plusieurs vidéos:

ffmpeg -i 75_540_38HQ2.mp4 -i 76_70_20.mp4 -i 76_173_80.mp4 -i 81_186_35.mp4 -vcodec copy -acodec copy Mux1.mp4

La résultante Mux1.mp4 ne contient pas toutes les vidéos. Seule la première vidéo (75_540_38HQ2.mp4). La taille du fichier de la source et de la vidéo résultante est inférieure (comme vous pouvez le voir, la vidéo résultante est légèrement plus grande que la première vidéo):

 $ ls -lh 
 - rw-r - r-- 1 dbaker dbaker 42M 2011-03-24 11:59 75_540_38HQ2.mp4 
 - rw-r - r - 1 dbaker dbaker 236M 2011-03-24 12:09 76_173_80.mp4 
 - rw-r - r-- 1 dbaker dbaker 26M 2011-03-24 12:05 76_70_20.mp4 
 -rw-r - r-- 1 dbaker dbaker 54M 2011-03-24 12:15 81_186_35.mp4 
 - rw-r - r-- 1 dbaker dbaker 44M 2011-03-24 14: 48 Mux1.mp4 

Voici la sortie de la commande ffmpeg. Pour moi, cela semble correct, montrant les multiples entrées de source et la sortie unique.

 Version FFmpeg SVN-r26402, Copyright (c) 2000-2011 les développeurs FFmpeg 
 Ont construit le 21 mars 2011 18:05:32 avec la configuration gcc 4.4.5 
: - enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable -libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab 
 libavutil 50.36. 0/50,36. 0 
 Libavcore 0,16. 1/0,16. 1 
 Libavcodec 52.108. 0/52.108. 0 
 Libavformat 52.93. 0/52,93. 0 
 Libavdevice 52. 2. 3/52. 2. 3 
 Libavfilter 1.74. 0/1,74. 0 
 Libswscale 0,12. 0/0,12. 0 
 Libpostproc 51. 2. 0/51. 2. 0 
 Entrée # 0, mov, mp4, m4a, 3gp, 3g2, mj2, de '75_540_38HQ2.mp4': 
 Métadonnées: 
 Major_brand: isom 
 Minor_version: 512 
 Compatible_brands: isomiso2avc1mp41 
 Creation_time: 1970-01-01 00:00:00 
 Encodeur : Lavf52.93.0 
 Durée: 00: 00: 29.99, début: 0.000000, débit binaire: 11517 kb/s 
 Flux n ° 0.0 (eng): Vidéo: h264, yuv420p, 1280x960 [PAR 1: 1 DAR 4: 3], 11575 kb/s, 29,94 ips, 29,97 tbr, 30k tbn, 59,94 tbc 
 Métadonnées: 
 Creation_time: 1970-01-01 00:00:00 
 Stream # 0.1 (eng): Audio: aac, 48000 Hz, stéréo, s16, 127 kb/s 
 Métadonnées: 
 Creation_time: 1970-01-01 00:00:00 
 Entrée # 1, mov, mp4, m4a, 3gp, 3g2, mj2, from '76_70_20.mp4': 
 Metadata: 
 Major_brand: isom 
 Minor_version: 512 
 marques_compatibles: isomiso2avc1mp41 
 heure_création: 1970-01-01 00:00:00 [._ ___.] encodeur: Lavf52.93.0 
 Durée: 00: 00: 19.98, démarrage: 0.000000, débit binaire: 10901 kb/s 
 Stream # 1.0 (eng): Vidéo: h264, yuv420p, 1280x960 [PAR 1: 1 DAR 4: 3], 10804 kb/s, 29,97 ips, 29,97 tbr, 30k tbn, 59,94 tbc 
 Métadonnées: 
 Creation_time: 1970-01-01 00:00: 00 
 Stream # 1.1 (eng): Audio: aac, 48000 Hz, stéréo, s16, 128 kb/s 
 Métadonnées: 
 Creation_time: 1970-01-01 00:00 : 00 
 Entrée # 2, mov, mp4, m4a, 3gp, 3g2, mj2, de '76_173_80.mp4': 
 Métadonnées: 
 Major_brand: isom 
 minor_version: 512 
 marques_compatibles: isomiso2avc1mp41 
 creation_time: 1970-01-01 00:00:00 
 encodeur: Lavf52.93.0 
 Durée: 00: 03: 09.99 , début: 0,000000, débit binaire: 10393 kb/s 
 Flux n ° 2.0 (eng): Vidéo: h264, yuv420p, 1280x960 [PAR 1: 1 DAR 4: 3], 10321 kb/s, 29,96 ips, 29,97 tbr, 30k tbn, 59,94 tbc 
 Métadonnées: 
 creation_time: 197 0-01-01 00:00:00 
 Flux # 2.1 (eng): Audio: aac, 48000 Hz, stéréo, s16, 128 kb/s 
 Métadonnées: 
 Creation_time : 1970-01-01 00:00:00 
 
 Il semble que la fréquence d'images du codec du flux 0 diffère de la fréquence d'images du conteneur: 119,88 (120000/1001) -> 30000,00 (30000/1) 
 Entrée # 3, mov, mp4, m4a, 3gp, 3g2, mj2, de '81_186_35.mp4': 
 Métadonnées: 
 Major_brand: isom 
 Minor_version: 512 
 marques_compatibles: isomiso2avc1mp41 
 heure_création: 1970-01-01 00:00:00 
 encodeur: Lavf52.93.0 
 Durée: 00: 00: 35.00, début: 0.000000, débit binaire: 12700 kb/s 
 Stream # 3.0 (eng): Vidéo: h264, yuv420p, 1280x720 [PAR 1: 1 DAR 16: 9], 12620 kb/s, 59,91 ips, 30k tbr, 60k tbn, 119.88 tbc 
 Métadonnées: 
 Heure_création: 1970-01-01 00:00:00 
 Flux # 3.1 (eng): Audio: aac, 48000 Hz, stéréo, s16, 128 kb/s 
 Métadonnées: 
 heure_création: 1970-01-01 00:00:00 
 O sortie # 0, mp4, vers 'Mux1.mp4': 
 Métadonnées: 
 major_brand: isom 
 minor_version: 512 
 compatible_brands: isomiso2avc1mp41 
 creation_time : 1970-01-01 00:00:00 Encodeur 
: Lavf52.93.0 
 Stream # 0.0 (eng): Vidéo: libx264, yuv420p, 1280x960 [PAR 1: 1 DAR 4: 3] , q = 2-31, 11575 kb/s, 30k tbn, 29,97 tbc 
 Métadonnées: 
 creation_time: 1970-01-01 00:00:00 
 Stream # 0.1 ( eng): Audio: libfaac, 48000 Hz, stéréo, 128 kb/s 
 Métadonnées: 
 creation_time: 1970-01-01 00:00:00 
 Mappage de flux: 
 Stream # 0.0 -> # 0.0 
 Stream # 2.1 -> # 0.1 
 Appuyez sur [q] pour arrêter l'encodage 
 Frame = 883 fps = 632 q = -1.0 Lsize = 44730 ko temps = 29,40 bitrate = 12465,1 kbits/s 
 Vidéo: 41678 ko audio: 2969 ko en-têtes globaux: 0 ko au-dessus du multiplexage 0,184548% 

Suis-je en train de faire quelque chose de stupidement aveugle ici?

Les vidéos source proviennent d'une caméra vidéo et sont de petits extraits pris avec ffmpeg -i bigfile.mp4 -ss 20 -t 10 -vcodec copy etc..

Merci des tas !! Dave


Edit: ne pouvait pas le résoudre, donc j'utilise simplement l'outil GUI avidemux. Il semblait bien ajouter le MP4.

Cela doit être un problème avec les MP4 ou tout simplement ceux qui sortent d'une caméra GoPro.

50
dtbaker

Vous devez les convertir en un format MPEG qui peut être facilement concaténé. Voici un script que j'utilise et que j'appelle "ffcat" pour mes vidéos GoPro. Il exécute essentiellement plusieurs commandes "ffmpeg -i" qui produisent un MPEG concaténable, qui est canalisé vers une commande ffmpeg qui les convertit ensuite en un fichier H.264 mp4.

Il dimensionne également les vidéos en 720p, mais vous ne le voudrez peut-être pas.

Les "h264options" sont des drapeaux que j'ai récemment trouvés sur Internet à h264.code-shop.com

J'espère que cela vous aide, Reid


cmd="( "

h264options="-vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \
 -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \
 -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \
 -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \
   -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\
 -qmax 51 -qdiff 4"

outfile="out-`date +%F-%H%M.%S`.mp4"

for i; do
    cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; "
done
cmd="${cmd} ) | ffmpeg -y -i - -threads 8 ${h264options} -vb 10000000 -acodec libfaac -ar 44100 -ab 128k -s 1280x720 ${outfile}"
echo "${cmd}"
eval ${cmd}
4
Reid Ellis

En supposant que vous souhaitez concaténer le film, vous pouvez utiliser la commande suivante:

ffmpeg -f concat -i inputs.txt -vcodec copy -acodec copy Mux1.mp4

Avec le texte suivant dans inputs.txt:

file 75_540_38HQ2.mp4 
file 76_70_20.mp4 
file 76_173_80.mp4
file 81_186_35.mp4

Remarque: certaines distributions (comme Ubuntu) n'ont pas ffmpeg dans leur référentiel et définissent plutôt ffmpeg comme un alias d'avconv. Cela ne fonctionnera pas avec avconv, donc dans un tel cas, vous devez compiler ffmpeg vous-même. Vous pouvez vérifier si vous avez le vrai ffmpeg en exécutant ffmpeg et en vérifiant si la première ligne de sortie se termine par "les développeurs FFmpeg".

19
bcmpinc

Oubliez FFmpeg, utilisez plutôt MP4Box, c'est facile et plus rapide:

    mp4box -add video1.mp4 -cat video2.mp4 -cat video3.mp4 output.mp4

Il est disponible pour Windows, Linux et OS X: http://www.videohelp.com/tools/mp4box

Si vous êtes sous Windows, vous pouvez utiliser YAMB qui est une interface graphique pour MP4Box qui fonctionne très bien: http://www.videohelp.com/tools/YAMB

MISE À JOUR juin 2016: FFmpeg a ajouté un filtre de concaténation, plus d'informations ici: https://stackoverflow.com/a/11175851/ 218418

13
Rodrigo Polo

Dans la section "Exemples" de la page de manuel ffmpeg:

Vous pouvez mettre plusieurs flux du même type dans la sortie:

ffmpeg -i test1.avi -i test2.avi -vcodec copy -acodec copy \ -vcodec copy -acodec copy test12.avi -newvideo -newaudio

En plus des premiers flux vidéo et audio, le fichier de sortie résultant test12.avi contiendra la deuxième vidéo et le deuxième flux audio trouvés dans la liste des flux d'entrée.

Les options "-newvideo", "-newaudio" et "-newsubtitle" doivent être spécifiées immédiatement après le nom du fichier de sortie auquel vous souhaitez les ajouter.

Si vous vouliez les concaténer, la FAQ contient des instructions.

Je ne sais pas si cette question/réponse appartient à SuperUser .

7
David Pope

La concaténation simple fonctionne pour les fichiers mp4 et mkv si toutes les vidéos d'entrée ont le même codec et que vous souhaitez également la sortie vidéo dans le même codec. https://trac.ffmpeg.org/wiki/Concatenate
vous devez créer un fichier texte comme

# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

Et puis utilisez la commande

ffmpeg -f concat -i mylist.txt -c copy output.mp4

J'ai utilisé l'exemple de la même page de référence, cela fonctionne plutôt bien. Le seul problème survient lorsque la vidéo n'est pas correctement capturée. Il peut introduire des problèmes de synchronisation audio vidéo car il copie simplement les informations PTS et DTS des vidéos source vers la vidéo de destination).
.

5
Satyam Naolekar

Concat demuxer

Le démultiplexeur concat a été ajouté à ffmpeg 1.1. Si votre version de ffmpeg est trop ancienne, récupérez le dernier binaire statique d'ici: http://www.ffmpeg.org/download .html

Instructions

Créez un fichier mylist.txt avec tous les fichiers à concaténer sous la forme suivante (les lignes commençant par un tiret sont ignorées):

# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

Notez que ceux-ci peuvent être des chemins relatifs ou absolus. Ensuite, vous pouvez encoder vos fichiers avec:

ffmpeg -f concat -i mylist.txt -c copy output

Il est possible de générer ce fichier de liste avec une boucle bash for, ou en utilisant printf. L'un des éléments suivants générerait un fichier de liste contenant chaque * .wav dans le répertoire de travail:

for f in ./*.wav; do echo "file '$f'" >> mylist.txt; done
printf "file '%s'\n" ./*.wav > mylist.txt

Source: wiki ffmpeg

3
erik

J'utilise ce script avec succès. Les résultats sont parfaits car il utilise une vidéo brute.

http://trac.ffmpeg.org/wiki/How%20to%20concatenate%20%28join,%20merge%29%20media%20files

Assurez-vous de modifier la chaîne OPTIONS SUPPLÉMENTAIRES.

#!/bin/bash

################################################################################
#
# Script name: MultiMedia Concat Script (mmcat)
# Author: burek ([email protected])
# License: GNU/GPL, see http://www.gnu.org/copyleft/gpl.html
# Date: 2012-07-14
#
# This script concatenates (joins, merges) several audio/video inputs into one
# final output (just like as if all the inputs were played in a playlist, one
# after another).
#
# All input files must have at least one audio and at least one video stream.
# If not, you can easily add audio silence, using FFmpeg. Just search the
# internet for "ffmpeg add silence".
#
# The script makes use of FFmpeg tool (www.ffmpeg.org) and is free for use under
# the GPL license. The inspiration for this script came from this FAQ item:
# http://ffmpeg.org/faq.html#How-can-I-join-video-files_003f
#
# If you find any bugs, please send me an e-mail so I can fix it.
#
################################################################################
#
# General syntax: mmcat <input1> <input2> <input3> ... <output>
#
# For example: mmcat file1.flv file2.flv output.flv
# would create "output.flv" out of "file1.flv" and "file2.flv".
#
################################################################################

# change this to what you need !!!
EXTRA_OPTIONS='-vcodec libx264 -crf 23 -preset medium -acodec aac -strict experimental -ac 2 -ar 44100 -ab 128k'

################################################################################
#
# NO NEED TO TOUCH ANYTHING AFTER THIS LINE!
#
################################################################################

# the version of the script
VERSION=1.3

# location of temp folder
TMP=/tmp

################################################################################

echo "MultiMedia Concat Script v$VERSION (mmcat) - A script to concatenate multiple multimedia files."
echo "Based on FFmpeg - www.ffmpeg.org"
echo "Don't forget to edit this script and change EXTRA_OPTIONS"
echo ""

################################################################################
# syntax check (has to have at least 3 params: infile1, infile2, outfile
################################################################################
if [ -z $3 ]; then
    echo "Syntax: $0 <input1> <input2> <input3> ... <output>"
    exit 1
fi

################################################################################
# get all the command line parameters, except for the last one, which is output
################################################################################
# $first  - first parameter
# $last   - last parameter (output file)
# $inputs - all the inputs, except the first input, because 1st input is
#           handled separately
################################################################################
first=${@:1:1}
last=${@:$#:1}
len=$(($#-2))
inputs=${@:2:$len}

# remove all previous tmp fifos (if exist)
rm -f $TMP/mcs_*

################################################################################
# decode first input differently, because the video header does not have to be
# kept for each video input, only the header from the first video is needed
################################################################################
mkfifo $TMP/mcs_a1 $TMP/mcs_v1

ffmpeg -y -i $first -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a1 2>/dev/null </dev/null &
ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1 2>/dev/null </dev/null &

# if you need to log the output of decoding processes (usually not necessary)
# then replace the "2>/dev/null" in 2 lines above with your log file names, like this:
#ffmpeg -y -i $first -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a1 2>$TMP/log.a.1 </dev/null &
#ffmpeg -y -i $first -an -f yuv4mpegpipe -vcodec rawvideo $TMP/mcs_v1 2>$TMP/log.v.1 </dev/null &

################################################################################
# decode all the other inputs, remove first line of video (header) with tail
# $all_a and $all_v are lists of all a/v fifos, to be used by "cat" later on
################################################################################
all_a=$TMP/mcs_a1
all_v=$TMP/mcs_v1
i=2
for f in $inputs
do
    mkfifo $TMP/mcs_a$i $TMP/mcs_v$i

    ffmpeg -y -i $f -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a$i 2>/dev/null </dev/null &
    { ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>/dev/null </dev/null | tail -n +2 > $TMP/mcs_v$i ; } &

    # if you need to log the output of decoding processes (usually not necessary)
    # then replace the "2>/dev/null" in 2 lines above with your log file names, like this:
    #ffmpeg -y -i $f -vn -f u16le -acodec pcm_s16le -ac 2 -ar 44100 $TMP/mcs_a$i 2>$TMP/log.a.$i </dev/null &
    #{ ffmpeg -y -i $f -an -f yuv4mpegpipe -vcodec rawvideo - 2>$TMP/log.v.$i </dev/null | tail -n +2 > $TMP/mcs_v$i ; } &

    all_a="$all_a $TMP/mcs_a$i"
    all_v="$all_v $TMP/mcs_v$i"
    let i++
done

################################################################################
# concatenate all raw audio/video inputs into one audio/video
################################################################################
mkfifo $TMP/mcs_a_all
mkfifo $TMP/mcs_v_all
cat $all_a > $TMP/mcs_a_all &
cat $all_v > $TMP/mcs_v_all &

################################################################################
# finally, encode the raw concatenated audio/video into something useful
################################################################################
ffmpeg -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i $TMP/mcs_a_all \
       -f yuv4mpegpipe -vcodec rawvideo -i $TMP/mcs_v_all \
    $EXTRA_OPTIONS \
    $last

################################################################################
# remove all fifos
################################################################################
rm -f $TMP/mcs_*
3
denjello

MP4Box fonctionne sans interrompre l'audio. J'ai fait ce qui suit pour obtenir de bons résultats:

  1. Téléchargez la dernière version de Linux deb depuis le site web de gpac: http://gpac.wp.mines-telecom.fr/downloads/gpac-nightly-builds/

  2. Utilisez le -force-cat option

Exemple de ligne de commande:

MP4Box -force-cat -add in1.mp4 -cat in2.mp4 -cat in3.mp4 ... out.mp4

Quelques commentaires mineurs:

  1. La méthode ci-dessus est importante, car la dernière version de MP4Box distribuée avec Linux Mint 13 est boguée et entraîne un son corrompu.

  2. -force-cat est important, car la balise de format vidéo est passée d'AVC à avc3 sans elle.

0
numberer6

Vous pouvez éviter de créer explicitement un fichier de liste et faire le tout en une seule ligne

ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4

Reportez-vous à ffmpeg wiki .

0
Kris Roofe