2015-02-12 6 views
5

Utilizzando il wrapper AForge ffmpeg è possibile estrarre i frame da un video utilizzando la classe VideoFileReader e salvarlo come bitmap.C# estrae i frame da una parte di un file video

vedere questo per l'exemple: Extracting frames of a .avi file

Il mio problema con questo è che non si può specificato da dove iniziare la lettura dei fotogrammi. Inizia sempre dall'inizio del file video.

Ma cosa succede se volevo estrarre i frame che si trovano nel bel mezzo di un file video di due ore. Usando quella classe dovresti analizzare l'intera prima ora per arrivare a quei frame.

Qualcuno sa come raggiungerlo?

+0

Sembra che non abbiano fornito un modo per farlo. Puoi provare a imbrogliare tagliando il file usando una libreria diversa, o semplicemente usando una libreria diversa per estrarre i frame per cominciare. EDIT: puoi eseguire il debug e vedere i membri privati ​​dell'istanza di 'VideoFileReader', e vedere se forse Reflection può aiutarti qui. – SimpleVar

+0

Sembra una buona risposta per me, non ti va bene? –

risposta

4

Se si sa dove nel video si desidera iniziare a leggere, basta saltare il numero appropriato di fotogrammi; non è necessario elaborare nessuno di essi.

Ciò presuppone, ovviamente, che si conosca il numero esatto di fotogramma da cui si desidera iniziare la lettura, che è possibile calcolare moltiplicando il framerate per il momento in cui si desidera eseguire l'estrazione. Nel tuo esempio, se il video è lungo due ore e si desidera estrarre fotogrammi dal mezzo ...

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 

Questo presuppone che la proprietà .FrameRate restituisce il valore in fotogrammi al secondo. Sfortunatamente il documentation non dice, quindi non sono sicuro di come gestisca i file video con framerate non integrali (ad esempio 29.97 è un framerate comune).

+0

Questo sembra sfortunatamente al momento l'unico modo con il wrapper AForge/Accord. Aggiungerei se utilizzi questo metodo per disporre ogni fotogramma che stai buttando via, '' videoFrame.Dispose() '' (all'interno del ciclo di salto) altrimenti otterrai degli errori dopo circa 1k di fotogrammi. –