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.
Tópicos relacionados