Formato de secuencia

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Tanto MSDV como el controlador UVC pueden generar dos formatos DV: audio-vídeo intercalado o solo vídeo. El audio-vídeo intercalado es el formato original del dispositivo. El formato de solo vídeo contiene los mismos datos, pero las muestras se marcan como sin datos de audio. El formato de solo vídeo existe principalmente por compatibilidad con aplicaciones que usan Video para Windows. Para obtener más información, vea Type-1 vs. Type-2 DV AVI Files.

Controlador MSDV

El controlador MSDV tiene dos patillas de salida. El primer pin de salida envía datos intercalados y el segundo pin de salida envía datos de solo vídeo. Solo se puede conectar un pin de salida a la vez. Para seleccionar un formato, conecte el pin de salida adecuado. Puede usar la interfaz IAMStreamConfig en el pin de salida para buscar el formato.

Controlador UVC

A diferencia del controlador MSDV, el controlador UVC ofrece ambos formatos desde el mismo pin. El formato predeterminado es solo vídeo. Para seleccionar el formato, use la interfaz IAMStreamConfig en el pin de salida. Llame al método GetStreamCaps para enumerar los tipos de medios en el pin de salida. Para cada tipo de medio, si el tipo principal coincide con el formato deseado, llame a SetFormat y pase ese tipo de medio.

Formato Tipo principal
Audio y vídeo intercalados MEDIATYPE_Interleaved
Solo vídeo MEDIATYPE_Video

 

La siguiente función establece el formato basado en el GUID de tipo principal.

HRESULT SetStreamFormat(IAMStreamConfig *pConfig, const GUID& majorType)
{
    if (pConfig == NULL)
    {
        return E_POINTER;
    }

    // Get the number of stream capabilities.
    int count = 0, size = 0;
    HRESULT hr = pConfig->GetNumberOfCapabilities(&count, &size);
    if (FAILED(hr))
    {
        return hr;
    }

    // Allocate memory for the stream capabilities structure.
    BYTE *pCaps = new BYTE[size];
    if (pCaps == NULL)
    {
        return E_OUTOFMEMORY;
    }
    
    // Enumerate the stream capabilities.
    bool bFoundType = false;
    for (int ix = 0; ix < count; ix++)
    {
        AM_MEDIA_TYPE *pmt;
        hr = pConfig->GetStreamCaps(ix, &pmt, pCaps);
        if (FAILED(hr))
        {
            break;
        }
        else if (pmt->majortype == majorType)
        {
            // This is the media type we want.
            bFoundType = true;
            hr = pConfig->SetFormat(pmt);
            DeleteMediaType(pmt);
            break;
        }
        DeleteMediaType(pmt);
    }
    delete [] pCaps;
    if (FAILED(hr))
    {
        return hr;
    }
    return bFoundType ? S_OK : E_FAIL;
}

El controlador MSDV también admite IAMStreamConfig, por lo que puede escribir código que funcione para ambos tipos de dispositivo.

Control de una videocámara DV