Aynı videodan klipleri ffmpeg ile birleştirmek


15

İçinde farklı sahneler olan uzun bir videom var. Ben ffmpeg 2.1.4 kullanarak videodan (bir I-çerçeve üzerinde başlamayan) 2 sahneleri ayıklamak ve birleştirmek istiyorum.

Tartışma için, 01:00 ve 02:00 arasında 5 saniye istiyorum diyelim.

Bunu yapabilirim:

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

Bu bana istediğim filmi veriyor, ancak select aslında ffmpeg'i filmin geri kalanını deşifre etmeye zorlar. Peki, ilk filmi kodunu çözmek yerine kısaltmasını nasıl söyleyebilirim?

Mümkünse bunu bir ffmpeg karmaşık filtre ile yapmayı tercih ederim. -tÖncelikle ayrı filmleri yeniden kodlamak için kullanabileceğimi biliyorum , ancak ekstra kodlama adımı benim durumumda çok yavaş ve bu video için makul miktarda kalite kaybediyor.

Bir buharın uzunluğunu kısaltan bir filtre bulamıyorum. -tVeya -ssparametrelerine karşılık gelen filtre düğümleri var mı?

Yanıtlar:


16

concat filtresi

Ek filtreleme yapmanız gerekiyorsa bu yöntem en iyisidir:

Kullanım trim, atrim, setpts, asetpts, ve concatfiltreler:

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
  • setptsve asetptssunum zaman damgası sorunları nedeniyle sarsıntılı bir çıkışı önleyecektir.

  • Son sürümü kullandığınızdan emin olun. Windows, OS X ve Linux için yapılara bağlantılar için FFmpeg İndirme sayfasına bakın .


concat demuxer

Başka bir yöntem, segmentleri ayrı ayrı oluşturmak ve yeniden kodlama (zaman ve kalite tasarrufu sağlamak) yerine kopyalamak ve bunları concat demuxer ile birleştirmektir .

$ 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 teşekkürler. Döşeme eksik olduğum şey. Ancak, sanki herşeyi çözüyormuş gibi, belirlediğim zaman ofsetine ulaşmak çok uzun zaman alıyor. Ayrıca, çıktının bir kısmında ses eksikti. Düzeltmek için, -ss ile aynı girişi birden çok kez belirledim, ardından videoyu kısaltmak için trim'i kullandım. Bu durumda ayarlara ihtiyacınız yoktur, çünkü ss pts değerini 0 olarak ayarlar. Akışları kopyalamaya gelince, daha önce denedim. Önceki I-karesinde başlar, böylece filmin istediğiniz birinden farklı bir parçası elde edersiniz.
Mart'ta

Soruma cevap verir misiniz, buna benzer. video.stackexchange.com/questions/18247/…
Eftekhari

İlginçtir -filter_complexama çalışır ama concatdosyaları - yani 1. video iyi görünüyor ama 2. kalitesi korkunç. Not, bu komutları her ikisi için de tam olarak kopyaladım (giriş dosyası hariç).
bobmarksie

7

Bu daha hızlı çalışmalı ...

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

Çıktıda -t belirtilmesine gerek yoktur. Konsattan önce ses ve videoyu bölmeye gerek yoktur.


1
Bu, yeniden kodlama gerektiren concat filtreyi kullanır. Bu kullanıcı tarafından istenebilir veya istenmeyebilir.
llogan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.