web-dev-qa-db-ja.com

ffmpeg:複数のmp4ビデオを結合/マージできない。出力には最初のビデオのみが含まれる

複数のビデオを結合するために使用しているコマンドは次のとおりです。

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

結果として Mux1.mp4にはすべての動画が含まれているわけではありません。最初の動画のみ(75_540_38HQ2.mp4)。ソースと結果のビデオのファイルサイズは以下です(ご覧のとおり、結果のビデオは最初のビデオよりもわずかに大きくなります)。

 $ 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 

ffmpegコマンドの出力は次のとおりです。私には大丈夫そうで、複数のソース入力と単一の出力を示しています。

 FFmpegバージョンSVN-r26402、著作権(c)2000-2011 FFmpeg開発者
 2011年3月21日18:05:32、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 
 '75_540_38HQ2.mp4'からの#0、mov、mp4、m4a、3gp、3g2、mj2の入力:
メタデータ:
 major_brand:isom 
 minor_version:512 
 compatible_brands:isomiso2avc1mp41 
 creation_time:1970-01-01 00:00:00 
エンコーダー:Lavf52.93.0 
持続時間:00:00:29.99、開始:0.000000、ビットレート:11517 kb/s 
ストリーム#0.0(eng):ビデオ:h264、yuv420p、1280x960 [PAR 1: 1 DAR 4:3]、11575 kb/s、29.94 fps、29.97 tbr、30k tbn、59.94 tbc 
メタデータ:
 creation_time:1970-01-01 00:00:00 
ストリーム#0.1(eng):オーディオ:aac、48000 Hz、ステレオ、s16、127 kb/s 
メタデータ:
 creation_time:1970-01-01 00:00:00 
入力#1、mov、mp4、m4a、3gp、3g2、mj2から '76_70_20.mp4':
メタデータ:
 major_brand:isom 
 minor_version:512 
 compatible_brands:isomiso2avc1mp41 
 creation_time:1970-01-01 00:00:00 [._ ___。]エンコーダー:Lavf52.93.0 
期間:00:00:19.98、開始:0.000000、ビットレート:10901 kb/s 
ストリーム#1.0(eng):ビデオ:h264、yuv420p、1280x960 [PAR 1:1 DAR 4:3]、10804 kb/s、29.97 fps、29.97 tbr、30k tbn、59.94 tbc 
メタデータ:
 creation_time:1970-01-01 00:00: 00 
ストリーム#1.1(eng):オーディオ:aac、48000 Hz、ステレオ、s16、128 kb/s 
メタデータ:
 creation_time:1970-01-01 00:00 :00 
入力#2、mov、mp4、m4a、3gp、3g2、mj2、「76_173_80.mp4」から:
メタデータ:
 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 、開始:0.000000、ビットレート:10393 kb/s 
ストリーム#2.0(eng):ビデオ:h264、yuv420p、1280x960 [PAR 1:1 DAR 4:3]、10321 kb/s、29.96 fps、29.97 tbr、30k tbn、59.94 tbc 
メタデータ:
 creation_time:197 0-01-01 00:00:00 
ストリーム#2.1(eng):オーディオ:aac、48000 Hz、ステレオ、s16、128 kb/s 
メタデータ:
 creation_time :1970-01-01 00:00:00 
 
ストリーム0コーデックフレームレートがコンテナフレームレートと異なるようです:119.88(120000/1001)-> 30000.00(30000/1)
「81_186_35.mp4」からの入力#3、mov、mp4、m4a、3gp、3g2、mj2:
メタデータ:
 major_brand:isom 
 minor_version:512 
 compatible_brands:isomiso2avc1mp41 
 creation_time:1970-01-01 00:00:00 
エンコーダー:Lavf52.93.0 
期間:00:00:35.00、開始:0.000000、ビットレート:12700 kb/s 
ストリーム#3.0(eng):ビデオ:h264、yuv420p、1280x720 [PAR 1:1 DAR 16:9]、12620 kb/s、59.91 fps、30k tbr、60k tbn、 119.88 tbc 
メタデータ:
 creation_time:1970-01-01 00:00:00 
ストリーム#3.1(eng):オーディオ:aac、48000 Hz、ステレオ、s16、128 kb/s 
メタデータ:
 creation_time:1970-01-01 00:00:00 
 O utput#0、mp4、「 'Mux1.mp4':
メタデータ:
 major_brand:isom 
 minor_version:512 
 compatible_brands:isomiso2avc1mp41 
 creation_time :1970-01-01 00:00:00 
エンコーダー:Lavf52.93.0 
ストリーム#0.0(eng):ビデオ:libx264、yuv420p、1280x960 [PAR 1:1 DAR 4:3] 、q = 2-31、11575 kb/s、30k tbn、29.97 tbc 
メタデータ:
 creation_time:1970-01-01 00:00:00 
 Stream#0.1( eng):オーディオ:libfaac、48000 Hz、ステレオ、128 kb/s 
メタデータ:
 creation_time:1970-01-01 00:00:00 
ストリームマッピング:
ストリーム#0.0->#0.0 
ストリーム#2.1->#0.1 
 [q]を押してエンコードを停止します
 frame = 883 fps = 632 q = -1.0 Lsize = 44730kB時間= 29.40ビットレート= 12465.1kbits/s 
ビデオ:41678kBオーディオ:2969kBグローバルヘッダー:0kB多重化オーバーヘッド0.184548%

ここで目がくらむようなことをしていますか?

ソースビデオはビデオカメラからのものであり、ffmpeg -i bigfile.mp4 -ss 20 -t 10 -vcodec copy etc..

ありがとうヒープ!!デイブ


編集:それを解決できなかったので、avidemux GUIツールを使用します。 MP4を追加するようです。

MP4の問題か、goproカメラから外れたMP4の問題でなければなりません。

50
dtbaker

簡単に連結できるMPEG形式に変換する必要があります。以下は、GoProビデオで「ffcat」を使用して呼び出すスクリプトです。本質的には、連結可能なMPEGを生成するいくつかの「ffmpeg -i」コマンドを実行します。このコマンドは、ffmpegコマンドにパイプされ、H.264 mp4ファイルに変換されます。

また、ビデオのサイズが720pになりますが、これは望ましくない場合があります。

「h264options」は、最近インターネットで見つけたフラグです h264.code-shop.com

これがお役に立てば幸いです、リード


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

ムービーを連結する場合、次のコマンドを使用できます。

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

Inputs.txtに次のテキストが含まれています:

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

:一部のディストリビューション(Ubuntuなど)では、リポジトリにffmpegがなく、代わりにffmpegをavconvのエイリアスとして定義しています。これはavconvでは機能しないため、そのような場合はffmpegを自分でコンパイルする必要があります。 ffmpegを実行し、最初の出力行が「FFmpeg開発者」で終わるかどうかを確認することにより、実際のffmpegがあるかどうかを確認できます。

19
bcmpinc

FFmpegを忘れて、代わりにMP4Boxを使用してください。簡単で高速です。

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

Windows、Linux、OS Xで利用可能です: http://www.videohelp.com/tools/mp4box

Windowsを使用している場合、素晴らしい動作をするMP4BoxのGUIであるYAMBを使用できます。 http://www.videohelp.com/tools/YAMB

UPDATE Jun-2016:FFmpegは連結フィルターを追加しました。詳細はこちら: https://stackoverflow.com/a/11175851/ 218418

13
Rodrigo Polo

Ffmpegのマニュアルページの「例」セクションから:

同じタイプの多くのストリームを出力に含めることができます。

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

最初のビデオストリームとオーディオストリームに加えて、結果の出力ファイルtest12.aviには、入力ストリームリストにある2番目のビデオと2番目のオーディオストリームが含まれます。

「-newvideo」、「-newaudio」、および「-newsubtitle」オプションは、追加する出力ファイルの名前の直後に指定する必要があります。

それらを連結したい場合、 [〜#〜] faq [〜#〜] に指示があります。

この質問/回答が SuperUser に属するかどうかはわかりません。

7
David Pope

シンプルな連結は、すべての入力ビデオが同じコーデックを持ち、同じコーデックでも出力ビデオが必要な場合、mp4およびmkvファイルに対して機能します。 https://trac.ffmpeg.org/wiki/Concatenate
次のようなテキストファイルを作成する必要があります

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

そして、コマンドを使用します

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

同じリファレンスページの例を使用しましたが、かなりうまく機能します。唯一の問題は、ビデオが適切にキャプチャされない場合に発生します。 PTSとDTS情報をソースビデオから宛先ビデオにコピーするだけなので、オーディオビデオ同期の問題が発生する可能性があります。
完全なプルーフソリューションを得るには、パケットごとにビデオを読み、すべてのパケットを1つのビデオにまとめる必要があります。PTSパケットの繰り返しのドロップや単調なPTS値の維持などのカスタマイズが最適化されます。

5
Satyam Naolekar

Concatデマルチプレクサ

Concat demuxerはffmpeg 1.1に追加されました。 ffmpegのバージョンが古い場合、ここから最新の静的バイナリを取得します:http://www.ffmpeg.org/download .html

説明書

ファイルを作成するmylist.txt連結したいすべてのファイルを次の形式で(ダッシュで始まる行は無視されます):

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

これらは相対パスでも絶対パスでもかまいません。その後、次の方法でファイルをエンコードできます。

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

このリストファイルは、bash forループを使用して、またはprintfを使用して生成できます。次のいずれかは、作業ディレクトリ内のすべての* .wavを含むリストファイルを生成します。

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

ソース: ffmpeg wiki

3
erik

私はこのスクリプトを非常にうまく使用しています。生のビデオを使用しているため、結果は完璧です。

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

EXTRA OPTIONS文字列を必ず編集してください。

#!/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は、音声を中断することなく機能します。良い結果を得るために次のことをしました。

  1. Gpac Webサイトから最新のLinux debビルドをダウンロードします。 http://gpac.wp.mines-telecom.fr/downloads/gpac-nightly-builds/

  2. 使用 -force-catオプション

サンプルのコマンドライン:

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

いくつかのマイナーなコメント:

  1. Linux Mint 13で配布されているMP4Boxの最新バージョンはバグが多く、オーディオが破損するため、上記の方法は重要です。

  2. -force-catは重要です。ビデオ形式タグがAVCからavc3に変更されたためです。

0
numberer6

リストファイルを明示的に作成せずに、1行ですべてを実行できます。

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

ffmpeg wiki を参照してください。

0
Kris Roofe