Formato de fluxo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Tanto o MSDV quanto o driver UVC podem gerar dois formatos DV: áudio-vídeo intercalado ou somente vídeo. O áudio-vídeo intercalado é o formato original do dispositivo. O formato somente vídeo contém os mesmos dados, mas os exemplos são marcados como sem dados de áudio. O formato somente vídeo existe principalmente para compatibilidade com aplicativos que usam Vídeo para Windows. Para obter mais informações, consulte Type-1 vs. Type-2 DV AVI Files.

MSDV Driver

O driver MSDV tem dois pinos de saída. O primeiro pin de saída envia dados intercalados e o segundo pin de saída envia dados somente vídeo. Somente um pino de saída pode ser conectado por vez. Para selecionar um formato, conecte o pino de saída apropriado. Você pode usar a interface IAMStreamConfig no pino de saída para localizar o formato.

UVC Driver

Ao contrário do driver MSDV, o driver UVC entrega os dois formatos do mesmo pino. O formato padrão é somente vídeo. Para selecionar o formato, use a interface IAMStreamConfig no pino de saída. Chame o método GetStreamCaps para enumerar os tipos de mídia no pino de saída. Para cada tipo de mídia, se o tipo principal corresponder ao formato desejado, chame SetFormat e passe esse tipo de mídia.

Formatar Tipo principal
Áudio e vídeo intercalados MEDIATYPE_Interleaved
Somente vídeo MEDIATYPE_Video

 

A função a seguir define o formato com base no GUID do 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;
}

O driver MSDV também dá suporte a IAMStreamConfig, para que você possa escrever código que funcione para ambos os tipos de dispositivo.

Controlando uma câmera DV