Настройка формата записи видео
Устройство записи видео может поддерживать несколько форматов записи. Форматы обычно отличаются по типу сжатия, цветовой области (YUV или RGB), размеру кадра или частоте кадров.
Список поддерживаемых форматов содержится в дескрипторе презентации . Дополнительные сведения см. в дескрипторах презентаций.
Перечисление поддерживаемых форматов:
- Создайте источник мультимедиа для устройства записи. См. перечисление устройств записи видео.
- Вызовите IMFMediaSource::CreatePresentationDescriptor в источнике мультимедиа, чтобы получить дескриптор презентации.
- Вызовите IMFPresentationDescriptor::GetStreamDescriptorByIndex, чтобы получить дескриптор потока для видеопотока.
- Вызов IMFStreamDescriptor::GetMediaTypeHandler для дескриптора потока.
- Вызовите IMFMediaTypeHandler::GetMediaTypeCount, чтобы получить количество поддерживаемых форматов.
- В цикле вызовите IMFMediaTypeHandler::GetMediaTypeByIndex, чтобы получить каждый формат. Формат представлен носителем типа . Дополнительные сведения см. в разделе Типы мультимедиа видео.
В следующем примере перечисляются форматы записи для устройства:
HRESULT EnumerateCaptureFormats(IMFMediaSource *pSource)
{
IMFPresentationDescriptor *pPD = NULL;
IMFStreamDescriptor *pSD = NULL;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pType = NULL;
HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
if (FAILED(hr))
{
goto done;
}
BOOL fSelected;
hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD);
if (FAILED(hr))
{
goto done;
}
hr = pSD->GetMediaTypeHandler(&pHandler);
if (FAILED(hr))
{
goto done;
}
DWORD cTypes = 0;
hr = pHandler->GetMediaTypeCount(&cTypes);
if (FAILED(hr))
{
goto done;
}
for (DWORD i = 0; i < cTypes; i++)
{
hr = pHandler->GetMediaTypeByIndex(i, &pType);
if (FAILED(hr))
{
goto done;
}
LogMediaType(pType);
OutputDebugString(L"\n");
SafeRelease(&pType);
}
done:
SafeRelease(&pPD);
SafeRelease(&pSD);
SafeRelease(&pHandler);
SafeRelease(&pType);
return hr;
}
Функция LogMediaType
, используемая в этом примере, указана в разделе код отладки типа носителя.
Чтобы задать формат записи, выполните следующие действия.
- Получите указатель на интерфейс IMFMediaTypeHandler, как показано в предыдущем примере.
- Вызовите IMFMediaTypeHandler::GetMediaTypeByIndex, чтобы получить нужный формат, указанный индексом.
- Вызовите IMFMediaTypeHandler::SetCurrentMediaType, чтобы задать формат.
Если формат записи не задан, устройство будет использовать его формат по умолчанию.
В следующем примере задается формат записи:
HRESULT SetDeviceFormat(IMFMediaSource *pSource, DWORD dwFormatIndex)
{
IMFPresentationDescriptor *pPD = NULL;
IMFStreamDescriptor *pSD = NULL;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pType = NULL;
HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
if (FAILED(hr))
{
goto done;
}
BOOL fSelected;
hr = pPD->GetStreamDescriptorByIndex(0, &fSelected, &pSD);
if (FAILED(hr))
{
goto done;
}
hr = pSD->GetMediaTypeHandler(&pHandler);
if (FAILED(hr))
{
goto done;
}
hr = pHandler->GetMediaTypeByIndex(dwFormatIndex, &pType);
if (FAILED(hr))
{
goto done;
}
hr = pHandler->SetCurrentMediaType(pType);
done:
SafeRelease(&pPD);
SafeRelease(&pSD);
SafeRelease(&pHandler);
SafeRelease(&pType);
return hr;
}
Порядок возврата форматов зависит от устройства. Как правило, они группируются сначала по типу сжатия или цветовой области; а затем от наименьшего размера кадра до самого большого размера кадра в каждой группе.
Частота кадров обрабатывается немного иначе, чем другие атрибуты формата. Дополнительные сведения см. в разделе Настройкачастоты захвата видео.
Заметка
На некоторых устройствах список форматов будет содержать повторяющиеся записи для каждого формата. Например, если устройство поддерживает 15 различных форматов записи, список будет содержать 30 записей. В каждой паре один из типов мультимедиа будет иметь атрибут MF_MT_AM_FORMAT_TYPE равным FORMAT_VideoInfo, а другой будет иметь MF_MT_AM_FORMAT_TYPE равным FORMAT_VideoInfo2. (Эти два значения определены в файле заголовка uuids.h.) Второй тип также может содержать дополнительные сведения о цвете (расширенные сведения о цвете) или показать другое значение для чередовки (MF_MT_INTERLACE_MODE). Эти повторяющиеся типы существуют для поддержки старых приложений DirectShow. В приложении Media Foundation следует игнорировать тип FORMAT_VideoInfo всякий раз, когда указан повторяющийся тип FORMAT_VideoInfo2.
Связанные разделы