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