ffmpegは、コマンドラインでffmpegを使用して2つのmp4ファイルを結合します


28

次のコマンドを使用して、複数のファイルを正常に結合できます。

ffmpeg -f concat -i input.txt -codec copy output.mp4

このコマンドの唯一の問題は、次の内容のinput.txtというテキストファイルからファイルパスを読み取る必要があることです。

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'

ファイルからファイルパスを読み取ることなく同じ目標を達成する方法はありますか?私は運のない次を試しました:

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4

別のコマンドを使用する必要がありますか?


回答:


36

2019アップデート:

コメントで述べたように、Stack Overflowには、連結に使用できるオプションの優れた説明と、使用しているファイルの種類に応じて使用する方法の説明があります。

FFmpegを使用して2つのMP4ファイルを連結する方法は?

元の2016年の回答:

concatプロトコルメソッドを使用してファイルを結合できるはずです。

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

さらに、FFmpegマニュアルでは、MP4ファイルを無損失で連結するための方法について具体的に説明していますが、一時ファイル(または名前付きパイプ)を作成する必要があります。

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

1
最初のコマンドはバターのように機能しました。6つのmp4ファイルを出力ファイル(約239 MB)に連結するのに2〜3秒かかりました。
サチン

22
最初のコマンドは機能しませんでした。最初のファイルをコピーしただけです。
ルイスA.フローリット

3
これは機能せず、最初のファイルをにコピーしただけですoutput.mp4
crmpicco

2
ファイルレベルの連結はMP4では機能しないため、この形式ではconcatプロトコルは推奨されず、通常は機能しません。
llogan

1
@brasofiloリンクありがとうございます。これは長らく待ち望まれていましたが、私は答えを更新して人々をその方向に向けました。
カーソンダーリン

5

ffmpeg でリストを出力しstdout、リストから読み取ることで、ファイルをリストに置き換えることができますstdin

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"

Mac OS 10.12.6でffmpegバージョン2.4.3-tessusを使用すると、「認識されないオプション 'protocol_whitelist'」というエラーがスローされます。protocol_whitelistオプションがなければ、2番目のMP4ファイルのコピーを作成するだけのようです。
ジェームズ

2

いいえ、ハックなしでffmpeg concat demuxerを単一のコマンドラインで使用する方法はないようです。ファイルのリストを使用して入力テキストファイルを作成する必要があります。私はこれを自分では奇妙だと思っていました。多分誰かがこれをFFMpegに後日追加するでしょう。

この質問に対する受け入れられた答えは、OPが要求したconcat demuxerではなく、concatプロトコルを使用します。


1
実際にあります。stdin。
Qwertiy

concatプロトコルは、MP4またはグローバルヘッダーを必要とするその他の形式で使用しないでください。
llogan

1

コマンドを変更せずにスクリプトで実行することもできます。何かのようなもの:

echo "file fname1" >$$.tmp    #single redirect creates or truncates file
echo "file fname2" >>$$.tmp   # double redirect appends
echo "file fname3" >>$$.tmp   # do as many as you want.

ffmpeg -f concat -i $$.tmp -codec copy output.mp4

rm $$.tmp  # just to clean up the temp file. 
           # For debugging, I usually leave this out.

$$はコマンドを実行しているシェルのpidに展開されるため、ファイル名は実行するたびに異なります。必要に応じて$$。txtを使用できます。または、他の何か...

また、ここのファイルを使用して、一連のデータをファイルに追加できます。

cat <<EOF >$$.tmp
file fname1
file fname2
file fname3
EOF

bash変数置換が機能するため、ファイルの内容をプログラムで決定できます。修正する必要はありません。私はこの種のものを常にforループに組み込んでいます。最後に、リダイレクトは上記と同じように機能するため、> $$。tmpは切り捨てられてから書き込み、>> $$。tmpが追加されます。


2
質問は、「ファイルからファイルパスを読み取ることなく同じ目標を達成する方法はありますか?」ファイルパスをファイルに書き込む方法を提供するだけです(ファイルからファイルパスを読み取る前に)。これは質問に答えません。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.