Формат потока
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
И MSDV, и драйвер UVC могут выводить два формата DV: чередующееся аудио-видео или только видео. Чередующееся аудио-видео — это исходный формат устройства. Формат только для видео содержит те же данные, но примеры помечаются как не имеющие звуковых данных. Формат только для видео предназначен в основном для обеспечения совместимости с приложениями, которые используют Видео для Windows. Дополнительные сведения см. в разделе Type-1 и Type-2 DV AVI Files.
Драйвер MSDV
Драйвер MSDV имеет два выходных контакта. Первый выходной контакт отправляет данные с чередованием, а второй — только видео. Одновременно можно подключить только один выходной контакт. Чтобы выбрать формат, подключите соответствующий выходной контакт. Для поиска формата можно использовать интерфейс IAMStreamConfig на выходном контакте.
Драйвер UVC
В отличие от драйвера MSDV, драйвер UVC предоставляет оба формата из одного контакта. Формат по умолчанию — только видео. Чтобы выбрать формат, используйте интерфейс IAMStreamConfig на выходном контакте. Вызовите метод GetStreamCaps , чтобы перечислить типы мультимедиа в выходном контакте. Для каждого типа мультимедиа, если основной тип соответствует требуемому формату, вызовите Метод SetFormat и передайте этот тип мультимедиа.
Формат | Основной тип |
---|---|
Чередующиеся аудио- и видео | MEDIATYPE_Interleaved |
Только видео | MEDIATYPE_Video |
Следующая функция задает формат на основе GUID основного типа.
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;
}
Драйвер MSDV также поддерживает IAMStreamConfig, поэтому вы можете написать код, который подходит для обоих типов устройств.
Связанные темы