Ç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.
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