2015-02-12 19 views
5

AForge ffmpeg sarıcısını kullanarak videoFileReader sınıfını kullanarak bir videodan kareler çıkarabilir ve bir bitmap olarak kaydedebilirsiniz. C# video dosyasının bir bölümündeki kareleri çıkarma

Exemple için bu bakınız: bununla Extracting frames of a .avi file

Sorunum çerçeveleri okumaya başlamak için nerede belirtilmemiş olmasıdır. Her zaman video dosyasının başlangıcından başlar.

Ancak iki saatlik bir video dosyasının ortasında bulunan kareleri çıkarmak istersem. Bu sınıfı kullanarak, bu karelere ulaşmak için ilk saat juste'ını ayrıştırmanız gerekir.

Bunu başarmanın bir yolu bilen var mı?

+0

Bunun için bir yol sağlamadılar. Dosyayı farklı bir kütüphane kullanarak keserek veya sadece başlamak için kareleri çıkarmak için farklı bir kütüphane kullanarak deneyebilirsiniz. DÜZENLEME: "VideoFileReader" örneğinin özel üyelerini tamamen ayıklayabilir ve görebilir ve Yansıma'nın burada size yardımcı olup olamayacağını görebilirsiniz. – SimpleVar

+0

Bana iyi bir cevap gibi geldi, sana uymadı mı? –

cevap

4

Videoda okumak istediğiniz yeri biliyorsanız, uygun sayıda kareyi atlayın; Bunlardan herhangi birini işlemeye gerek yok.

Bu, kuşkusuz, okumaya başlamak istediğiniz tam çerçeve numarasını bildiğinizi varsayar, bunu çerçevelemeyi çıkarma işlemini gerçekleştirmek istediğiniz zamana göre çarparak hesaplayabilirsiniz. senin örnekte, eğer

VideoFileReader reader = new VideoFileReader(); 
reader.Open("file.avi"); 

// Jump to 1 hour into the video 
int framesToSkip = reader.FrameRate * 3600; // 1 hour = 3600 seconds 
for (int i = 0; i < framesToSkip; i++) 
    reader.ReadVideoFrame(); 

// Now the next time ReadVideoFrame() is called, we will get the frame at the 1 hour mark 

Bu .FrameRate özellik saniyede kare değeri döndürür varsayar ... video iki saat uzunluğunda olduğunu ve ortada kare ayıklamak istiyorum. Ne yazık ki, documentation söylemiyor, bu yüzden, video dosyalarını integral olmayan çerçevelerle nasıl işleyeceğinden emin değilim (yani 29.97 ortak bir çerçevedir.)

+0

Bu, şu anda AForge/Accord sargısı ile tek yol olarak görünüyor. Eğer attığınız her çerçeveyi atmak için bu yöntemi kullanırsanız, ''videoFrame.Dispose()' '(atlama döngüsü dahilinde) kullanırsanız, ekleyeceğim. Aksi takdirde, yaklaşık 1k kare sonra hatalar elde edersiniz. –