Ffmpeg seçim filtresi ile tam karelerde videolar kesme


16

Çok doğru görünmeyen parametreleri kullanmak -ssve -toaramak yerine, verilen kare numaraları için video kesebilir miyim? Örneğin;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[80. çerçeve ve 560. çerçeve dahil. Yani, toplam olarak (560-80 +1) kare yapar]

Cevaplar ve biraz arama yaptıktan sonra, bazı komutları denedim. Ama şu ana kadar kabul edilebilir bir yol bulamadım.

Birisi 250 ve 750. kare arasında video akışını kesmek istiyorsa, bu yol. Çıktı olarak 501 kare verecektir:

Not: movie.mp4, 25 fps ve ses örnekleme oranı 48k

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

Beklendiği gibi, çıktı tam olarak 20 saniye uzunluğundadır.

Ses için aynı yöntemi kullanarak:

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

Beklenmedik bir şekilde, bu çok düşük bir doğruluğa sahiptir. Bana 20 saniyelik sese eşit 960001 (960k + 1) örnek vermeliydi. Ancak bunun yerine çıktı 20.505 saniye uzunluğundaydı ve 984240 örneği vardı. Ayrıca, süreyi arttırırsam hata da artar.

Sonra ses akışı kesmek için -ss -to parametrelerini kullanmaya çalıştım:

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

Eski klasik yol çok daha iyi çalışır. Çıktı 20.003 saniye uzunluğundaydı ve 960144 örneği vardı. Ayrıca, sürenin artması hatayı arttırmaz, hata sabittir, her zaman bu girdi dosyasıyla 144 örnek fazlası vardır.

Özetle: selectfiltre çoğu zaman iyi çalışır ancak bir seçim yapılmaz. Klasik -ssparametreler ses için daha iyi çalışır, ancak örnek doğru değildir. Ayrıca, parametreleri -vf selectve -ssparametreleri birlikte kullanmak mümkün değildir , çünkü -sssadece sesi etkilediğimiz sırada hem ses hem de video akışlarını etkileyecektir.

Yani, bir medya dosyasını kesin olarak kesmek için şu 3 adımı yapmam gerekiyor:

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

Bu en doğru sonuçları verir. Video 20.000 saniye uzunluğunda ve kare hassasiyetli Ses 20.003 saniye uzunluğunda ve 960144 örneği var. Video akışı ile tam olarak eşleşmiyor, ancak sorun yok. Sadece 144 numune fazlası vardır. En büyük dezavantajı, bir dosyayı kesmek istediğimde, basit bir iş için 3 komut göndermem ve iki gereksiz dosya oluşturmasıdır: a_stream.webm ve v_stream.webm. Ve selectfiltre denedim bazı girdi dosyaları üzerinde çalışmıyor. İş başarıyla (?) Yapar ama kodlama işlemini asla durdurmaz, bu yüzden her seferinde komut istemini kapatmak zorundayım.


Bu soruyu göndermeden önce o sayfayı okudum. Bu sayfa bana yardımcı olmadı. Bir girişte değişken fps varsa bu denklemi kullanarak hesaplayabilir miyiz? Ben öyle düşünmüyorum. Ayrıca hala '-ss' nin bana doğru pozisyon vereceğini düşünmüyorum. Kare kare arama daha iyi olurdu sanırım.
destor

Not -sshassas yapı (bakınız buraya ). Aslında değişken fps girişiniz var mı? Cevabım select, çerçeve numarasını belirtebileceğiniz filtreler kullanarak bahsi geçen posta listesi iş parçacığına bağlanıyor . Bunu denedin mi?
slhck

Ben kullanarak denedi selectve aselectvideo ve ses akışları için filtreler. Selectvideo için kare doğrudur, ancak aselectörnek doğru değildir. Aslında doğru olmaktan çok uzak. Basit -ss -toparamaterleri kullanmaktan çok daha kötü sonuçlar verir . Bu nedenle, şimdilik, en doğru kesimi elde etmek için selectfiltre ve -ss -toparametre kombinasyonunu kullanıyorum . Ama bunu yapmanın eski bir yolu. Lütfen ilk yazıma bak Bazı komut
satırları

ffmpeg sürümü?
yuh

Neden yine de bir kare numarası kesmeye çalışıyorsun. Eğer biri bu tür bir doğruluğa ihtiyaç duyarsa neden avidemux kullanmıyorsunuz? Ayrıca orijinal sorunlarınız en yakın ana kareyi seçmesinden kaynaklanıyor olabilir mi?
fie

Yanıtlar:


3

Ses karelerden değil saniyelerden gelir, bu nedenle bir videoyu kesmek istiyorsanız video fps × 20 saniye değerini şu şekilde hesaplamanız gerekir: 23.97 fps'lik 20 saniye = 479.4

Son saniyede tam fps alamadığınız için kare kesimi doğru değil, bu nedenle ses daha fazla saniye veya sadece yarım saniye veya biraz daha fazla veya daha az alacak! Belki kesin kesim elde etmek için kare yerine saniyeler kullanmalısınız, ffmpeg'e bunu sizin için yapmasını söylersiniz. Ve 1 ekstra kare alırsanız, 250 ve 750. kareleri 250 ve 749. karelere değiştirmeye ne dersiniz ?! Her zaman kaç kare istediğinizi elde etmek için eksi 1 kullanın!


Aslında ses örneklerden değil saniyelerden geliyor ...
Anubioz
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.