Настройка формата захвата видео

Устройство захвата видео может поддерживать несколько форматов захвата. Форматы обычно различаются по типу сжатия, цветовой области (YUV или RGB), размеру кадра или частоте кадров.

Список поддерживаемых форматов содержится в дескрипторе презентации. Дополнительные сведения см. в разделе Дескрипторы презентации.

Перечисление поддерживаемых форматов:

  1. Создайте источник мультимедиа для устройства захвата. См. раздел Перечисление устройств захвата видео.
  2. Вызовите IMFMediaSource::CreatePresentationDescriptor в источнике мультимедиа, чтобы получить дескриптор презентации.
  3. Вызовите IMFPresentationDescriptor::GetStreamDescriptorByIndex , чтобы получить дескриптор потока для видеопотока.
  4. Вызовите IMFStreamDescriptor::GetMediaTypeHandler в дескрипторе потока.
  5. Чтобы узнать количество поддерживаемых форматов, позвоните в IMFMediaTypeHandler::GetMediaTypeCount .
  6. В цикле вызовите 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 в этом примере, указана в разделе Код отладки типов мультимедиа.

Чтобы задать формат записи, выполните следующие действия.

  1. Получите указатель на интерфейс IMFMediaTypeHandler , как показано в предыдущем примере.
  2. Вызовите IMFMediaTypeHandler::GetMediaTypeByIndex , чтобы получить нужный формат, заданный индексом.
  3. Вызовите 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 .

 

Запись видео