Compartir a través de


Cómo establecer el formato de captura de vídeo

Un dispositivo de captura de vídeo puede admitir varios formatos de captura. Los formatos suelen diferir según el tipo de compresión, el espacio de color (YUV o RGB), el tamaño del marco o la velocidad de fotogramas.

La lista de formatos admitidos se encuentra en el descriptor de presentación. Para obtener más información, vea Descriptores de presentación.

Para enumerar los formatos admitidos:

  1. Cree el origen multimedia para el dispositivo de captura. Consulte Enumeración de dispositivos de captura de vídeo.
  2. Llame a IMFMediaSource::CreatePresentationDescriptor en el origen multimedia para obtener el descriptor de presentación.
  3. Llame a IMFPresentationDescriptor::GetStreamDescriptorByIndex para obtener el descriptor de secuencia de la secuencia de vídeo.
  4. Llame a IMFStreamDescriptor::GetMediaTypeHandler en el descriptor de secuencia.
  5. Llame a IMFMediaTypeHandler::GetMediaTypeCount para obtener el número de formatos admitidos.
  6. En un bucle, llame a IMFMediaTypeHandler::GetMediaTypeByIndex para obtener cada formato. El formato se representa mediante un tipo de medio. Para obtener más información, vea Tipos de medios de vídeo.

En el ejemplo siguiente se enumeran los formatos de captura de un dispositivo:

HRESULT EnumerateCaptureFormats(IMFMediaSource *pSource)
{
    IMFPresentationDescriptor *pPD = NULL;
    IMFStreamDescriptor *pSD = NULL;
    IMFMediaTypeHandler *pHandler = NULL;
    IMFMediaType *pType = NULL;

    HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
    if (FAILED(hr))
    {
        goto done;
    }

    BOOL fSelected;
    hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    DWORD cTypes = 0;
    hr = pHandler->GetMediaTypeCount(&cTypes);
    if (FAILED(hr))
    {
        goto done;
    }

    for (DWORD i = 0; i < cTypes; i++)
    {
        hr = pHandler->GetMediaTypeByIndex(i, &pType);
        if (FAILED(hr))
        {
            goto done;
        }

        LogMediaType(pType);
        OutputDebugString(L"\n");

        SafeRelease(&pType);
    }

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

La LogMediaType función usada en este ejemplo se muestra en el tema Código de depuración de tipos de medios.

Para establecer el formato de captura:

  1. Obtenga un puntero a la interfaz IMFMediaTypeHandler , como se muestra en el ejemplo anterior.
  2. Llame a IMFMediaTypeHandler::GetMediaTypeByIndex para obtener el formato deseado, especificado por índice.
  3. Llame a IMFMediaTypeHandler::SetCurrentMediaType para establecer el formato.

Si no establece el formato de captura, el dispositivo usará su formato predeterminado.

En el ejemplo siguiente se establece el formato de captura:

HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex)
{
    IMFPresentationDescriptor *pPD = NULL;
    IMFStreamDescriptor *pSD = NULL;
    IMFMediaTypeHandler *pHandler = NULL;
    IMFMediaType *pType = NULL;

    HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
    if (FAILED(hr))
    {
        goto done;
    }

    BOOL fSelected;
    hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->GetMediaTypeByIndex(dwFormatIndex, &pType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pHandler->SetCurrentMediaType(pType);

done:
    SafeRelease(&pPD);
    SafeRelease(&pSD);
    SafeRelease(&pHandler);
    SafeRelease(&pType);
    return hr;
}

El orden en que se devuelven los formatos depende del dispositivo. Normalmente, se agrupan primero por tipo de compresión o espacio de color; y, a continuación, desde el tamaño de fotograma más pequeño hasta el tamaño de fotograma más grande dentro de cada grupo.

La velocidad de fotogramas se controla ligeramente de forma diferente a los demás atributos de formato. Para obtener más información, vea Cómo establecer la velocidad de fotogramas de captura de vídeo.

Nota

En algunos dispositivos, la lista de formato contendrá una entrada duplicada para cada formato. Por ejemplo, si el dispositivo admite 15 formatos de captura distintos, la lista contendrá 30 entradas. Dentro de cada par, uno de los tipos de medios tendrá el atributo MF_MT_AM_FORMAT_TYPE igual a FORMAT_VideoInfo y el otro tendrá MF_MT_AM_FORMAT_TYPE igual a FORMAT_VideoInfo2. (Estos dos valores se definen en el archivo de encabezado uuids.h). El segundo tipo también puede contener información de color adicional (Información de color extendido) o mostrar un valor diferente para la entrelazamiento (MF_MT_INTERLACE_MODE). Estos tipos duplicados existen para admitir aplicaciones anteriores de DirectShow. En una aplicación de Media Foundation, debe omitir el tipo de FORMAT_VideoInfo cada vez que aparece un tipo de FORMAT_VideoInfo2 duplicado.

 

Captura de vídeo