枚举输入格式

[与此页面关联的功能 Windows Media Format 11 SDK 是一项旧功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用源读取器和接收器编写器,而不是 Windows Media 格式 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

每个 Windows Media 编解码器都接受一个或多个类型的输入媒体进行压缩。 Windows 媒体格式 SDK 使你能够输入比编解码器支持的格式更广泛的格式。 为此,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. 循环访问所有支持的输入格式,并针对每个格式执行以下步骤。
    • 通过调用 IWMWriter::GetInputFormat 检索输入格式的 IWMInputMediaProps 接口。
    • 检索输入格式 的WM_MEDIA_TYPE 结构。 调用 IWMMediaProps::GetMediaType,为 pType 参数传递 NULL 以获取结构的大小。 然后分配内存以保留结构,并再次调用 GetMediaType 以获取结构。 IWMInputMediaProps 继承自 IWMMediaProps,因此可以从上一步中检索到的 IWMInputMediaProps 实例调用 GetMediaType
    • 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 文件