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

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Она была заменена средствами чтения источника и модуля записи приемников. Средство чтения источника и модуль записи приемников оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде средство чтения исходного кода и модуль записи приемников вместо пакета SDK для Windows Media Format 11, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Каждый из кодеков Windows Media принимает один или несколько типов входных носителей для сжатия. Пакет SDK для форматов Windows Media позволяет вводить более широкие форматы, чем поддерживаемые кодеками. Пакет SDK делает это путем предварительной обработки преобразований входных данных при необходимости, таких как изменение размера видеокадров или повторная выборка звука. В любом случае необходимо убедиться, что форматы входных данных для записываемых файлов соответствуют данным, отправляемых в модуль записи. Каждый кодек имеет формат входного носителя по умолчанию, который задается в средстве записи при загрузке профиля. Вы можете проверить формат входных данных по умолчанию, вызвав IWMWriter::GetInputProps.

Видеокодеки поддерживают следующие форматы: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 и RGB 8. Аудиокодеки поддерживают звук PCM.

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

  1. Создайте объект записи и задайте профиль для использования. Дополнительные сведения о настройке профилей в записи см. в разделе Использование профилей с модулем записи.
  2. Определите входной номер, для которого требуется проверка форматов. Дополнительные сведения об идентификации входных номеров см. в разделе Определение входных данных по числу.
  3. Получите общее количество форматов входных данных, поддерживаемых нужными входными данными, вызвав IWMWriter::GetInputFormatCount.
  4. Циклически просматривайте все поддерживаемые форматы входных данных, выполняя следующие действия для каждого из них.
    • Получите интерфейс IWMInputMediaProps для формата входных данных, вызвав IWMWriter::GetInputFormat.
    • Получение структуры WM_MEDIA_TYPE для формата входных данных. Вызовите IWMMediaProps::GetMediaType, передав значение NULL для параметра pType , чтобы получить размер структуры. Затем выделите память для хранения структуры и снова вызовите Метод GetMediaType , чтобы получить структуру. IWMInputMediaProps наследует от IWMMediaProps, поэтому вы можете выполнять вызовы GetMediaType из экземпляра IWMInputMediaProps , полученного на предыдущем шаге.
    • Формат, описанный в структуре WM_MEDIA_TYPE , содержит все соответствующие сведения о формате ввода. Базовый формат носителя определяется по WM_MEDIA_TYPE.subtype. Для видеопотоков член pbFormat указывает на динамически выделенную структуру WMVIDEOINFOHEADER , которая содержит дополнительные сведения о потоке, включая размер прямоугольника. Размер входных кадров не требуется, чтобы точно соответствовать размеру, поддерживаемму кодеком. Если они не совпадают, компоненты среды выполнения пакета SDK во многих случаях автоматически изменят размер входных видеокадров до того, что может принять кодек.

В следующем примере кода выполняется поиск входного формата подтипа, переданного в качестве параметра. Дополнительные сведения об использовании этого кода см. в разделе Использование примеров кода.

HRESULT FindInputFormat(IWMWriter* pWriter, 
                       DWORD dwInput,
                       GUID guidSubType,
                       IWMInputMediaProps** ppProps)
{
    DWORD   cFormats = 0;
    DWORD   cbSize   = 0;

    WM_MEDIA_TYPE*      pType  = NULL;
    IWMInputMediaProps* pProps = NULL;

    // Set the ppProps parameter to point to NULL. This will
    //  be used to check the results of the function later.
    *ppProps = NULL;

    // Find the number of formats supported by this input.
    HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
    if (FAILED(hr))
    {
        goto Exit;
    }
    // Loop through all of the supported formats.
    for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
    {
        // Get the input media properties for the input format.
        hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Get the size of the media type structure.
        hr = pProps->GetMediaType(NULL, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Allocate memory for the media type structure.
        pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
        if (pType == NULL)
        {
            hr = E_OUTOFMEMORY;
            goto Exit;
        }
        
        // Get the media type structure.
        hr = pProps->GetMediaType(pType, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }

        if(pType->subtype == guidSubType)
        {
            *ppProps = pProps;
            (*ppProps)->AddRef();
            goto Exit;
        }

        // Clean up for next iteration.
        delete [] pType;
        pType = NULL;
        SAFE_RELEASE(pProps);
    } // End for formatIndex.

    // If execution made it to this point, no matching format was found.
    hr = NS_E_INVALID_INPUT_FORMAT;

Exit:
    delete [] pType;
    SAFE_RELEASE(pProps);
    return hr;
}

Интерфейс IWMWriter

Запись ASF-файлов