Cara menggabungkan klip dari video yang sama dengan ffmpeg


15

Saya punya video panjang dengan adegan berbeda di dalamnya. Saya ingin mengekstrak dan menggabungkan 2 adegan dari video (yang tidak dimulai pada I-frame) menggunakan ffmpeg 2.1.4.

Untuk argumen, katakan saya ingin 5 detik mulai pukul 01:00 dan 02:00.

Aku bisa melakukan ini:

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

Itu memberi saya film yang saya inginkan, tetapi pilih sebenarnya memaksa ffmpeg untuk memecahkan kode seluruh sisa film. Jadi, bagaimana saya mengatakannya untuk memotong film pertama alih-alih menerjemahkannya?

Saya lebih suka melakukan ini dengan filter kompleks ffmpeg, jika memungkinkan. Saya tahu bahwa saya hanya dapat menggunakan -tuntuk mengkode ulang film terpisah terlebih dahulu, tetapi langkah pengodean ekstra sangat lambat dalam kasus saya dan juga kehilangan kualitas yang cukup untuk video ini.

Sepertinya saya tidak dapat menemukan filter yang memotong panjang uap. Apakah ada simpul filter yang sesuai dengan -tatau -ssparameter?

Jawaban:


16

filter concat

Metode ini paling baik jika Anda perlu melakukan pemfilteran tambahan:

Gunakan trim, atrim, setpts, asetpts, dan concatfilter:

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
  • setptsdan asetptsakan mencegah keluaran tersentak karena masalah cap waktu presentasi.

  • Pastikan untuk menggunakan versi terbaru. Lihat halaman Unduhan FFmpeg untuk tautan ke build untuk Windows, OS X, dan Linux.


demuxer concat

Metode lain adalah membuat segmen secara individual dan menyalinnya, bukan mengkode ulang (untuk menghemat waktu dan kualitas), dan bergabung dengan mereka dengan demuxer concat .

$ 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
Ah terima kasih. trim adalah apa yang saya lewatkan. Namun, dibutuhkan waktu yang sangat lama untuk mencapai waktu offset yang saya tentukan, seolah-olah mendekode semuanya. Juga, bagian dari output audio hilang. Untuk memperbaikinya, saya menetapkan input yang sama beberapa kali dengan -ss, kemudian gunakan trim untuk memotong video. Anda tidak perlu setpts dalam kasus itu, karena ss menetapkan pts ke 0. Itu sepertinya berfungsi dan tidak memiliki jeda acak yang aneh selama penyandian. Adapun menyalin aliran, saya pernah mencobanya sebelumnya. Ini dimulai pada I-frame sebelumnya, sehingga Anda mendapatkan bagian film yang berbeda dari yang Anda inginkan.
Scubed

Tolong jawab pertanyaan saya, mirip dengan yang ini. video.stackexchange.com/questions/18247/…
Eftekhari

Menariknya -filter_complexkarya - karya tetapi concatfile tidak - yaitu video 1 terlihat bagus tetapi kualitas 2 mengerikan. Catatan, saya menyalin perintah ini persis untuk keduanya (kecuali untuk file input).
bobmarksie

7

Ini seharusnya bekerja lebih cepat ...

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

Tidak perlu menentukan -t pada output. Tidak perlu membagi audio dan video sebelum konser.


1
Ini menggunakan filter concat yang akan membutuhkan pengodean ulang. Ini mungkin atau mungkin tidak diinginkan oleh pengguna.
llogan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.