PDA

View Full Version : [DirectShow] Impostare il frame rate della webcam


sandor78
09-02-2007, 09:30
Salve a tutti.......
Io sto scrivendo un applicazione per acquisire video e immagini da diverse webcam, per fare ciò mi sono avvalso dell'aiuto delle librerie DirectShow.

Dopo un po di giorni di lavoro sono riuscito nel mio intento, è ho realizzato un strutture del tipo:

|Source Filter|-->| Smart Tee| cap |-->| Grab Filter |---->|Null Render |




L'ultima cosa che mi è rimasta da fere è quello di controllare il frame rate della webcam, che interfaccia devo usare e che cosa devo impostare nell'interfaccia.

Premetto il Source filter lo realizzato con un WDM Video Capture Filter


:mc:

okay
09-02-2007, 17:19
Salve a tutti.......
Io sto scrivendo un applicazione per acquisire video e immagini da diverse webcam, per fare ciò mi sono avvalso dell'aiuto delle librerie DirectShow.

Dopo un po di giorni di lavoro sono riuscito nel mio intento, è ho realizzato un strutture del tipo:

|Source Filter|-->| Smart Tee| cap |-->| Grab Filter |---->|Null Render |




L'ultima cosa che mi è rimasta da fere è quello di controllare il frame rate della webcam, che interfaccia devo usare e che cosa devo impostare nell'interfaccia.

Premetto il Source filter lo realizzato con un WDM Video Capture Filter


:mc:


per il frame rate devi usare:
m_pMediaPosition->put_Rate(fFrequenza);

per poter usare il code sopra devi inizializzare:

IMediaPosition* m_pMediaPosition;

m_pGraph->QueryInterface(IID_IMediaPosition, (void**)&m_pMediaPosition);

se digiti su google "directshow put_rate" trovi nell'msdn i metodi che ti servono.

put_rate va da 0 a 2 come frame rate.

Ti dico subito che a runtime questo metodo per lo meno con il sound non funziona bene cioè non aggiorna di continuo ma fà delle bizze. Solo dopo avere finito di digitare il tasto che incrementa o decrementa il put_rate si ha la giusta frequenza del rate per il video mi sembra se non ricordo male è uguale al sound.

Dato che lo uso ed usato per il sound alla fine ho dovuto usare Directsound per il sound proprio per aumentare e diminuire la frequenza a runtime perfettamente. Ma ripeto per il video con directshow dovrebbe anche andare bene in fondo si tratta solo di ridurre o aumentare la frequenza del rate non certamente in modo continuo come fosse il sound del motore di una moto passando dalla frequnza di giri minimi alla massima 200000mhz del sound di una moto legato appunto ai giri motore.

ciao

sandor78
12-02-2007, 08:47
Grazie dell'indicazione....proverò la tua soluzone..........

Però sono riuscito a modificare il frame rate della webcam cpn la seguente sintassi:

hr=m_pCapture->FindInterface(NULL,
NULL,
m_pSourceFilter,
IID_IAMStreamConfig,
(void**)&m_pStreamConfig);


//-------------------------------------------------------
//Get the stream format
hr=m_pStreamConfig->GetFormat(&m_pMediaType);

//-------------------------------------------------------
//Set the stream Format
//RGB 24 bit
m_pVih = (VIDEOINFOHEADER*)m_pMediaType->pbFormat;
m_pMediaType->pbFormat=(BYTE *)m_pVih;
actualTime=m_pVih->AvgTimePerFrame;
newTime=(long)(10000000/frameForSec);
m_pVih->AvgTimePerFrame=newTime;
m_pMediaType->pbFormat=(BYTE *)m_pVih;


hr=m_pStreamConfig->SetFormat(m_pMediaType);


che ne dici di qquesta soluzione????

okay
12-02-2007, 14:50
se per te tutto ok... direi ottimo!!!


ciao