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 de 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

le résultat Mux1.mp4 ne contient pas toutes les vidéos. Seulement la première vidéo (75_540_38HQ2.mp4). La taille du fichier de la source et de la vidéo résultante est ci-dessous (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 du ffmpeg la commande. Pour moi, il semble ok, montrant les entrées de source multiples et la sortie unique.

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Mar 21 2011 18:05:32 with gcc 4.4.5
  configuration: --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
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '75_540_38HQ2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:00:29.99, start: 0.000000, bitrate: 11517 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], 11575 kb/s, 29.94 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '76_70_20.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:00:19.98, start: 0.000000, bitrate: 10901 kb/s
    Stream #1.0(eng): Video: h264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], 10804 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #1.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '76_173_80.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:03:09.99, start: 0.000000, bitrate: 10393 kb/s
    Stream #2.0(eng): Video: h264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], 10321 kb/s, 29.96 fps, 29.97 tbr, 30k tbn, 59.94 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #2.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00

Seems stream 0 codec frame rate differs from container frame rate: 119.88 (120000/1001) -> 30000.00 (30000/1)
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from '81_186_35.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:00:35.00, start: 0.000000, bitrate: 12700 kb/s
    Stream #3.0(eng): Video: h264, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 12620 kb/s, 59.91 fps, 30k tbr, 60k tbn, 119.88 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #3.1(eng): Audio: aac, 48000 Hz, stereo, s16, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Output #0, mp4, to 'Mux1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
    Stream #0.0(eng): Video: libx264, yuv420p, 1280x960 [PAR 1:1 DAR 4:3], q=2-31, 11575 kb/s, 30k tbn, 29.97 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, 128 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #2.1 -> #0.1
Press [q] to stop encoding
frame=  883 fps=632 q=-1.0 Lsize=   44730kB time=29.40 bitrate=12465.1kbits/s    
video:41678kB audio:2969kB global headers:0kB muxing overhead 0.184548%

je fais quelque chose d'absolument stupide ici?

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

tas Merci!! Dave


Edit: Je n'ai pas pu le résoudre donc j'utilise simplement avidemux GUI tool. Il semble que le MP4 soit très bien ajouté.

doit être un problème avec les MP4 ou juste ceux qui viennent d'une caméra gopro.

42

8 réponses

vous devez les convertir dans un format MPEG qui peut être facilement concaténé. Ci-dessous, 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 MPEG concaténate-able, qui est pipé à une commande ffmpeg qui les convertit ensuite en fichier mp4 H. 264.

il Taille également les vidéos à 720p, mais vous pouvez ne pas vouloir que.

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

J'espère que cela aidera, 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
répondu Reid Ellis 2012-02-29 15:12:29

en Supposant que vous voulez 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 les entrées.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 dépôt 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 la vraie ffmpeg en exécutant ffmpeg et en vérifiant si le la première ligne de sortie se termine par"les développeurs FFmpeg".

13
répondu bcmpinc 2013-07-05 10:44:09

Oublier FFmpeg, utilisez MP4Box au lieu de cela, il est facile et 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 sur Windows, vous pouvez utiliser YAMB qui est une interface graphique pour MP4Box qui fonctionne très bien: http://www.videohelp.com/tools/YAMB

UPDATE Jun-2016: FFmpeg a ajouté un filtre de concaténation, pour en savoir plus ici: https://stackoverflow.com/a/11175851/218418

12
répondu Rodrigo Polo 2017-05-23 12:10:32

dans le ffmpeg homme page de la section "Exemples":

Vous pouvez mettre beaucoup de 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 du premier flux vidéo et audio, le fichier de sortie test12.avi contiendra la seconde vidéo et la seconde flux audio trouvé 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 vers lequel vous voulez pour les ajouter.

Si vous pensiez que vous voulez concaténer, le FAQ a des instructions.

Je ne suis pas sûr si cette question/réponse appartient à super-Utilisateur.

7
répondu David Pope 2015-07-22 09:39:26

simple concat fonctionne pour les fichiers mp4 et mkv si toutes les vidéos d'entrée ont le même codec et que vous voulez aussi des vidéos de sortie 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'

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, il fonctionne assez bien. Le seul problème vient quand la vidéo n'est pas correctement capturé. Il pourrait introduire la synchronisation vidéo audio problèmes parce qu'il ne fait que Copier les informations PTS et DTS à partir des vidéos source vers la vidéo destination.

Pour obtenir une solution de preuve complète, vous devez lire la vidéo paquet par paquet et puis rassemblez tous les paquets dans une vidéo avec des optimisations personnalisées comme la suppression des paquets pts répétitifs et le maintien des valeurs pts monotones.

4
répondu Satyam Naolekar 2018-07-26 06:35:35

j'ai utilisé ce script avec beaucoup de succès. Les résultats sont parfaits parce qu'il utilise la vidéo brute.

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

assurez-vous d'éditer la chaîne D'OPTIONS supplémentaires.

#!/bin/bash

################################################################################
#
# Script name: MultiMedia Concat Script (mmcat)
# Author: burek (burek021@gmail.com)
# 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  ]; then
    echo "Syntax:  <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
répondu denjello 2014-01-21 18:24:15

Concat demuxer

la concat demuxer a été ajoutée à ffmpeg 1.1. Si votre version de ffmpeg est à l'ancienne, obtenir le nouveau binaire statique à partir d'ici:http://www.ffmpeg.org/download.html

Instructions

Créer un fichier mylist.txt avec tous les fichiers que vous voulez avoir concaténés dans le formulaire suivant (les Lignes commençant par un tiret sont ignorés):

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

notez qu'ils peuvent être relatifs ou absolus chemin. Vous pouvez alors 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 un bash pour boucle, ou en utilisant printf. L'un ou l'autre 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:ffmpeg wiki

3
répondu erik 2014-03-02 01:37:27

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

  1. télécharger la dernière version de Linux DEB du site web gpac: http://gpac.wp.mines-telecom.fr/downloads/gpac-nightly-builds/

  2. -force-cat option

exemple de ligne de commande:

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

Quelques petits commentaires:

  1. la voie ci-dessus est importante, la dernière version de MP4Box distribué avec Linux Mint 13 est buggy, et ne résulte en audio corrompu.

  2. -force-cat est important, car la balise de format vidéo a été changée DE AVC à avc3 sans elle.

0
répondu numberer6 2014-10-13 16:22:53