ffmpegを使用して同じビデオのクリップを連結する方法


15

さまざまなシーンを含む長いビデオがあります。ffmpeg 2.1.4を使用して、ビデオから2つのシーン(Iフレームで開始しない)を抽出して連結したい。

引数として、01:00と02:00から5秒が欲しいと言います。

私がすることができます:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

それは私に欲しい映画を提供しますが、selectは実際にffmpegに映画の残り全体をデコードさせます。だから、最初の映画をデコードする代わりに切り捨てるようにするにはどうすればいいですか?

可能であれば、ffmpeg複合フィルターを使用してこれを行うことをお勧めします。-t最初に別々のムービーを再コーディングするためだけに使用できることを知っていますが、私の場合、余分なエンコーディング手順は非常に遅く、このビデオの品質もかなり低下します。

蒸気の長さを切り捨てるフィルターが見つからないようです。-tまたは-ssパラメータに対応するフィルターノードはありますか?

回答:


16

連結フィルター

この方法は、追加のフィルタリングを実行する必要がある場合に最適です。

使用しtrimatrimsetptsasetpts、およびconcatフィルタを:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptsおよびasetptsプレゼンテーションタイムスタンプの問題が原因ぎくしゃく出力を防ぐことができます。

  • 必ず最新バージョンを使用してください。Windows、OS X、およびLinuxのビルドへのリンクについては、FFmpegダウンロードページを参照しください。


連結デマルチプレクサ

別の方法は、セグメントを個別に作成し、再エンコードの代わりにそれらをストリームコピーして(時間と品質を節約する)、concat demuxerでそれらを結合することです。

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
ああ、ありがとう。トリムは私が行方不明でした。ただし、それまでのすべてをデコードするかのように、指定した時間オフセットに達するには非常に長い時間がかかります。また、出力の一部に音声がありませんでした。修正するために、-ssで同じ入力を複数回指定し、トリムを使用してビデオを切り捨てました。ssはptsを0に設定するので、その場合はsetptsは必要ありません。これは機能しているようで、エンコード中に奇妙なランダムな一時停止はありませんでした。ストリームのコピーに関しては、前に試しました。前のIフレームから開始されるため、ムービーの必要な部分とは異なる部分を取得できます。
14年

これに似ている私の質問に答えてください。video.stackexchange.com/questions/18247/...
Eftekhari

興味深いことに-filter_complex動作しconcatますが、ファイルは動作しません。つまり、1番目のビデオは問題なく見えますが、2番目のビデオの品質はひどいです。これらのコマンドは両方とも正確にコピーしました(入力ファイルを除く)。
-bobmarksie

7

これはより速く動作するはずです...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

出力で-tを指定する必要はありません。連結の前にオーディオとビデオを分割する必要はありません。


1
これは、再エンコードを必要とする連結フィルターを使用します。これは、ユーザーが望む場合と望まない場合があります。
llogan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.