ffmpeg: Combine/merge multiple mp4 videos not working, output only contains the first video

前端 未结 10 839
逝去的感伤
逝去的感伤 2020-12-22 22:48

Here is the command I am using to combine multiple videos:

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 M         


        
相关标签:
10条回答
  • 2020-12-22 22:59

    Simple concat works for mp4 and mkv files if all the input videos have the same codec and you want output video also in same codec. https://trac.ffmpeg.org/wiki/Concatenate
    you need to creat a text file like

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

    And then use command

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

    I have used the example from the same reference page, it works pretty well. The only issue comes when video is not properly captured. It might introduce audio video sync issues because it just copies the PTS and DTS information from the source videos to the destination video.
    To get a full proof solution you need to read video packet-by-packet and then put together all the packets in one video with customized optimizations like dropping repeating PTS packets and maintaining monotonic PTS values.

    0 讨论(0)
  • 2020-12-22 23:01

    Assuming you want to concatenate the movie, you can use the following command:

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

    With the following text in inputs.txt:

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

    Note: some distributions (like Ubuntu) do not have ffmpeg in their repository and instead define ffmpeg to be an alias of avconv. This won't work with avconv, so in such a case you have to compile ffmpeg yourself. You can check whether you have the real ffmpeg by running ffmpeg and checking if the first output line ends with "the FFmpeg developers".

    0 讨论(0)
  • 2020-12-22 23:10

    MP4Box does work without breaking the audio. I did the following to obtain good results:

    1. Download the latest Linux deb build from the gpac web site: http://gpac.wp.mines-telecom.fr/downloads/gpac-nightly-builds/

    2. Use the -force-cat option

    Sample command line:

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

    Some minor comments:

    1. The above way is important, as the latest version of MP4Box distributed with Linux Mint 13 is buggy, and does result in corrupted audio.

    2. -force-cat is important, as the video format tag was changed from AVC to avc3 without it.

    0 讨论(0)
  • 2020-12-22 23:13

    You can avoid explicitly creating a list file and do the whole thing in a single line

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

    Refer to ffmpeg wiki.

    0 讨论(0)
  • 2020-12-22 23:19

    Concat demuxer

    The concat demuxer was added to ffmpeg 1.1. If your version of ffmpeg is to old, get the newest static binary from here: http://www.ffmpeg.org/download.html

    Instructions

    Create a file mylist.txt with all the files you want to have concatenated in the following form (Lines starting with a dash are ignored):

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

    Note that these can be either relative or absolute paths. Then you can encode your files with:

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

    It is possible to generate this list file with a bash for loop, or using printf. Either one of the following would generate a list file containing every *.wav in the working directory:

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

    Source: ffmpeg wiki

    0 讨论(0)
  • 2020-12-22 23:21

    I have been using this script quite successfully. The results are perfect because it is using raw video.

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

    Make sure you edit the EXTRA OPTIONS string.

    #!/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 $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_*
    
    0 讨论(0)
提交回复
热议问题