Red de conocimiento informático - Espacio del host - Tengo una tarjeta de captura, ¿puedo usarla para conectar una cámara USB? ¿Cómo recoger?

Tengo una tarjeta de captura, ¿puedo usarla para conectar una cámara USB? ¿Cómo recoger?

Se recomienda utilizar DirectShow

Puede ayudarle a obtener datos del dispositivo de captura de vídeo y capturarlos a través del filtro Sample Grabber

Datos de transmisión de DirectShow Colección y captura de imágenes

Para usar una cámara con DirectShow, generalmente se requiere que el controlador de la cámara esté en formato WDM. Por supuesto, DirectShow también admite algunos formatos de controlador más antiguos. En DirectShow, hay un filtro Sample Grabber, que es un filtro que se puede insertar en la secuencia. Tiene su propio búfer para almacenar muestras. Podemos usarlo para simplemente capturar un fotograma de un archivo de vídeo. DirectShow se comunica con aplicaciones de capa superior y controladores de capa inferior a través de Filter Graph Manager. DirectShow admite la captura de la cámara a través de un filtro de captura. Un filtro de captura tiene múltiples conectores (pines) y el conector de vista previa se puede utilizar para mostrar imágenes.

1. Cree el administrador de filtros de gráficos Filter Graph

Como se menciona en el principio anterior, primero debe crear el Filter Graph:

CComPtr<IGraphBuilder>m_pGraph ;

p>

hr=m_pGraph.CoCreateInstance( CLSID_FilterGraph );

2. Conecte el dispositivo

Cree también el objeto del componente enumerador del sistema:

CComPtr pCreateDevEnum;pCreateDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum);

Luego use el método de interfaz CreateClassEnumerator () para crear un enumerador para el directorio de tipo de registro de filtro especificado y obtener la interfaz IenumMoniker. :

CComPtr<IEnumMoniker>pEm;

pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0

Luego, después de llamar a BindToObject(), puede generar un filtro DirectShow desde el identificador del dispositivo. Agréguelo al gráfico de filtro y podrá comenzar a trabajar.

CComPtrpM;

CComPtrpBag;

hr=pM->BindToStorage(0,0,ID_IPropertyBag, (void** ) &pBag );

3. Crear filtro Sample Grabber

CComPtr < ISampleGrabber > m_pGrabber

hr=m_pGrabber.CoCreateInstance( CLSID_SampleGrabber

<); p> Después de crear SampleGrabber, debe configurar el filtro Sample Grabber antes de poder conectarlo a otros filtros.

Luego consulte la interfaz IsampleGrabber y configure el tipo de medio de transmisión:

m_pGrabber->SetMediaType();

Puede especificar solo el tipo de medio principal o el tipo principal más el subtipo; el tipo principal, subtipos y formatos de tipo. Luego cárguelo en FilterGraph:

m_pGraph->AddFilter(pGrabBase, "Grabber "

4. Busque el pin de Filter Graph y complete la conexión posterior.

A continuación, puede encontrar la interfaz Pin en el administrador de filtros llamando a la interfaz FindPin() de IGraphBuilder y completar la conexión posterior a través de la interfaz RenderStream() en ICaptureGraphBuilder2.

hr=pCGB2->FindPin(pCap,PINDIR_OUTPUT,&PIN_CATEGORY_VIDEOPORT, NULL,FALSE,0,&pVPPin);

hr=pCGB2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, pCap,pGrabBase ,pRenderer);

5. Obtenga el tipo de medio de transmisión y ejecútelo

Después de obtener el tipo de medio de transmisión conectado a través de GetConnectedMediaType(), podemos usar la interfaz BufferCB() de la clase IsampleGrabberCB para Los datos del video se copian en un búfer personalizado y luego el video se copia a los datos de la imagen copiándolos en el búfer. Finalmente ejecute:

CComQIPtr pControl = m_pGraph;

hr = pControl->Run(

¿Cómo se implementa DirectShow específico? Puedes consultar la ayuda del SDK en DirectX9 y hay ejemplos relacionados que pueden ayudarte a hacerlo :)