2012-07-24 13 views
8

Sto trasmettendo il contenuto H264 da una telecamera IP utilizzando la VideoCapture di OpenCV (compilato con il supporto ffmpeg).Come gestire gli errori di decodifica di cv :: VideoCapture?

Quindi le cose lontane funzionare bene, ma ogni tanto ricevo errori di decodifica (da ffmpeg suppongo):

[h264 @ 0x103006400] mb_type 137 in I slice too large at 26 10 
[h264 @ 0x103006400] error while decoding MB 26 10 
[h264 @ 0x103006400] negative number of zero coeffs at 25 5 
[h264 @ 0x103006400] error while decoding MB 25 5 
[h264 @ 0x103006400] cbp too large (421) at 35 13 
[h264 @ 0x103006400] error while decoding MB 35 13 
[h264 @ 0x103006400] mb_type 121 in P slice too large at 20 3 
[h264 @ 0x103006400] error decoding MB 20 3 

Questi messaggi visualizzati nella console. C'è un modo pulito per ascoltarli? Mi piacerebbe saltare l'elaborazione dei frame glitch.

Eventuali suggerimenti/suggerimenti?

+0

di fronte lo stesso problema .... qualche soluzione ??? – tod

risposta

3

recentemente ho risolto lo stesso problema e provo a spiegare i passi che ho seguito.

ho aggiornato più recente opencv_ffmpeg.dll (ho rinominato opencv_ffmpeg.dll per opencv_ffmpeg310.dll da usare con OpenCV 3.1, ribattezzato anche lo stesso opencv_ffmpeg2412.dll dll da usare con OpenCV 2.4.12

così facendo, una cattura di base frame e display hanno avuto successo senza problemi.ma ancora lo stesso problema se faccio qualche elaborazione dell'immagine o rilevamento causa un ritardo tra l'acquisizione dei fotogrammi

per risolvere il secondo problema ho usato un thread per afferrare i frame in modo continuo e aggiornare un globale Mat per l'elaborazione.

here è possibile trovare il mio codice di prova (che ha bisogno di alcuni miglioramenti come l'utilizzo di mutex e la memoria di blocco quando l'aggiornamento del Mat)

Spero che le informazioni saranno utili (mi dispiace per il mio povero inglese)

+0

Non ho ancora provato questo, ma sembra molto più elegante di cercare di pipe nei messaggi di errore e saltare i frame. –

+0

recentemente il mio approccio spiegato da [Mare] (http://study.marearts.com/2016/03/opencv-rtsp-receiving-test.html) sul suo blog – sturkmen

0

Ho lo stesso problema. Mi sembra che il problema derivi dal fatto che la sorgente che ha originato il flusso è più lenta della decodifica. Probabilmente per la decodifica hai un ciclo infinito che legge i fotogrammi e li decodifica, il che potrebbe essere più veloce di quello che la tua fonte può inviarti.

Non so come fermarmi e attendere fino a quando il buffer è pieno .. Sto usando un file, in modo tale che la mia sorgente di macchina scrive un file e leggo fotogrammi da esso nel mio programma di decodifica. Finora non sono stato in grado di sincronizzarli

+0

hai ragione, ho avuto un ciclo infinito, ma non ho trovato una soluzione al problema. Stavo pensando alle tubazioni nell'output della console da opencv/ffmpeg e utilizzo dei frame solo quando non sono stati riscontrati errori di decodifica mentre l'hacky si aggira, ma non sono riuscito a implementarlo o trovare una soluzione più elegante –

+0

Ho pensato allo stesso, ma non ho idea di come farlo ..:/ – Nacho

Problemi correlati