Partilhar via


Formato de fluxo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no 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 eo driver UVC pode saída dois formatos DV: intercalada áudio-vídeo ou vídeo apenas. Áudio-vídeo intercalado é o formato original do dispositivo. O formato somente vídeo contém os mesmos dados, mas as amostras são marcadas como não tendo 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 arquivos AVI DV Type-1 vs. Type-2.

Driver MSDV

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

UVC Driver

Ao contrário do driver MSDV, o driver UVC oferece ambos os formatos a partir do mesmo pino. O formato padrão é somente vídeo. Para selecionar o formato, use o IAMStreamConfig interface no pino de saída. Chame o GetStreamCaps método 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.

Formato Tipo principal
Áudio e vídeo intercalados MEDIATYPE_Interleaved
Apenas 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 suporta IAMStreamConfig, para que você possa escrever código que funcione para ambos os tipos de dispositivo.

Controlar uma câmara de vídeo DV