2015-02-12 18 views
5

Korzystanie z narzędzia AFFge ffmpeg umożliwia wyodrębnianie klatek z wideo za pomocą klasy VideoFileReader i zapisywanie jej jako bitmapy.C# wyodrębnia ramki z części pliku wideo

Zobacz to dla exemple: Extracting frames of a .avi file

Mój problem z tym jest to, że nie można określić, od czego zacząć czytanie ramek. Zawsze zaczyna się od początku pliku wideo.

Ale co, gdybym chciał wyodrębnić ramki, które są w środku dwugodzinnego pliku wideo. Korzystając z tej klasy, musisz przeanalizować całą pierwszą godzinę, by dostać się do tych ramek.

Czy ktoś wie, jak to osiągnąć?

+0

Wydaje się, że nie zapewniały sposobu na zrobienie tego. Możesz spróbować oszukać przez wycięcie pliku przy użyciu innej biblioteki lub po prostu użyć innej biblioteki, aby wyodrębnić ramki na początek. EDYCJA: Możesz całkowicie debugować i zobaczyć prywatnych członków instancji 'VideoFileReader' i sprawdzić, czy może tutaj pomoże Ci Reflection. – SimpleVar

+0

Wygląda mi na dobrą odpowiedź, czy ci to nie odpowiadało? –

Odpowiedz

4

Jeśli wiesz, gdzie w filmie chcesz rozpocząć czytanie, po prostu pomiń odpowiednią liczbę klatek; nie ma potrzeby przetwarzania żadnego z nich.

Zakłada to oczywiście, że znasz dokładny numer ramki, od którego chcesz zacząć czytać, co możesz obliczyć, mnożąc liczbę klatek na sekundę do czasu, w którym chcesz przeprowadzić ekstrakcję. W przykładzie, jeśli film jest dwa długie godziny i chcesz, aby wyodrębnić klatek z środku ...

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 

ta zakłada, że ​​nieruchomość .FrameRate zwraca wartość klatek na sekundę. Niestety, documentation nie mówi, więc nie jestem pewien, w jaki sposób obsługuje pliki wideo o nierozdzielnych klatek na sekundę (tj. 29,97 jest częstym framerate.)

+0

To niefortunnie wydaje się być obecnie jedynym sposobem z opakowaniem AForge/Accord. Dodałbym, jeśli użyjesz tej metody do wyrzucenia każdej klatki, którą wyrzucasz, '' videoFrame.Dispose() '' (w pętli pomijania) w przeciwnym razie dostaniesz błędy po około 1k klatek. –

Powiązane problemy