未压缩的视频媒体类型

本主题介绍如何创建描述未压缩视频格式的媒体类型。 有关媒体类型一般的详细信息,请参阅 关于媒体类型

若要创建完整的未压缩视频类型,请在 IMFMediaType 接口指针上设置以下属性。

属性 说明
MF_MT_MAJOR_TYPE 主要类型。 设置为 MFMediaType_Video
MF_MT_SUBTYPE 亚。 请参阅 视频子类型 GUID
MF_MT_DEFAULT_STRIDE 图面步幅。 步幅是从一行像素到下一行像素所需的字节数。 如果步幅(以字节为单位)与视频宽度(以字节为单位)不同,请设置此属性。 否则,可以省略此属性。
MF_MT_FRAME_RATE 帧速率。
MF_MT_FRAME_SIZE 帧大小。
MF_MT_INTERLACE_MODE 交错模式。
MF_MT_ALL_SAMPLES_INDEPENDENT 指定每个样本是否独立。 对于未压缩的格式,设置为 TRUE
MF_MT_PIXEL_ASPECT_RATIO 像素纵横比。

 

此外,如果知道正确的值,请设置以下属性。 (否则,请省略这些 attributes。)

属性 说明
MF_MT_VIDEO_PRIMARIES 颜色主色。
MF_MT_TRANSFER_FUNCTION 传输函数。
MF_MT_YUV_MATRIX 传输矩阵。
MF_MT_VIDEO_CHROMA_SITING 色度定位。
MF_MT_VIDEO_NOMINAL_RANGE 名义范围。

 

有关详细信息,请参阅 扩展的颜色信息。 例如,如果创建描述视频标准的媒体类型,并且标准定义色度定位,请将此信息添加到媒体类型。 这样做有助于在整个管道中保持颜色保真度。

创建视频媒体类型时,以下函数可能很有用。

函数 说明
MFAverageTimePerFrameToFrameRate 根据平均帧持续时间计算帧速率。
MFCalculateImageSize 计算未压缩视频格式的图像大小。
MFFrameRateToAverageTimePerFrame 计算给定帧速率的视频帧的平均持续时间。
MFGetStrideForBitmapInfoHeader 返回视频格式的最小图面步幅。 有关详细信息,请参阅 Image Stride
MFInitVideoFormat 为某些标准视频格式(如 NTSC 电视)初始化 MFVIDEOFORMAT 结构。 然后,可以使用 结构初始化媒体类型。
MFIsFormatYUV 查询视频格式是否为 YUV 格式。

 

示例

此示例演示一个函数,该函数填充未压缩视频格式的最常见信息。 函数返回 IMFMediaType 接口指针。 然后,可以根据需要向媒体类型添加其他属性。

HRESULT CreateUncompressedVideoType(
    DWORD                fccFormat,  // FOURCC or D3DFORMAT value.     
    UINT32               width, 
    UINT32               height,
    MFVideoInterlaceMode interlaceMode,
    const MFRatio&       frameRate,
    const MFRatio&       par,
    IMFMediaType         **ppType
    )
{
    if (ppType == NULL)
    {
        return E_POINTER;
    }

    GUID    subtype = MFVideoFormat_Base;
    LONG    lStride = 0;
    UINT    cbImage = 0;

    IMFMediaType *pType = NULL;

    // Set the subtype GUID from the FOURCC or D3DFORMAT value.
    subtype.Data1 = fccFormat;

    HRESULT hr = MFCreateMediaType(&pType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetGUID(MF_MT_SUBTYPE, subtype);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_INTERLACE_MODE, interlaceMode);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, width, height);
    if (FAILED(hr))
    {
        goto done;
    }

    // Calculate the default stride value.
    hr = pType->SetUINT32(MF_MT_DEFAULT_STRIDE, UINT32(lStride));
    if (FAILED(hr))
    {
        goto done;
    }

    // Calculate the image size in bytes.
    hr = MFCalculateImageSize(subtype, width, height, &cbImage);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_SAMPLE_SIZE, cbImage);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    if (FAILED(hr))
    {
        goto done;
    }

    // Frame rate
    hr = MFSetAttributeRatio(pType, MF_MT_FRAME_RATE, frameRate.Numerator, 
        frameRate.Denominator);
    if (FAILED(hr))
    {
        goto done;
    }

    // Pixel aspect ratio
    hr = MFSetAttributeRatio(pType, MF_MT_PIXEL_ASPECT_RATIO, par.Numerator, 
        par.Denominator);
    if (FAILED(hr))
    {
        goto done;
    }

    // Return the pointer to the caller.
    *ppType = pType;
    (*ppType)->AddRef();

done:
    SafeRelease(&pType);
    return hr;
}

下一个示例采用编码的视频格式作为输入,并创建匹配的未压缩视频类型。 例如,此类型适合在编码器或解码器上设置。

HRESULT ConvertVideoTypeToUncompressedType(
    IMFMediaType *pType,    // Pointer to an encoded video type.
    const GUID& subtype,    // Uncompressed subtype (eg, RGB-32, AYUV)
    IMFMediaType **ppType   // Receives a matching uncompressed video type.
    )
{
    IMFMediaType *pTypeUncomp = NULL;

    HRESULT hr = S_OK;
    GUID majortype = { 0 };
    MFRatio par = { 0 };

    hr = pType->GetMajorType(&majortype);

    if (majortype != MFMediaType_Video)
    {
        return MF_E_INVALIDMEDIATYPE;
    }

    // Create a new media type and copy over all of the items.
    // This ensures that extended color information is retained.

    if (SUCCEEDED(hr))
    {
        hr = MFCreateMediaType(&pTypeUncomp);
    }

    if (SUCCEEDED(hr))
    {
        hr = pType->CopyAllItems(pTypeUncomp);
    }

    // Set the subtype.
    if (SUCCEEDED(hr))
    {
        hr = pTypeUncomp->SetGUID(MF_MT_SUBTYPE, subtype);
    }

    // Uncompressed means all samples are independent.
    if (SUCCEEDED(hr))
    {
        hr = pTypeUncomp->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
    }

    // Fix up PAR if not set on the original type.
    if (SUCCEEDED(hr))
    {
        hr = MFGetAttributeRatio(
            pTypeUncomp, 
            MF_MT_PIXEL_ASPECT_RATIO, 
            (UINT32*)&par.Numerator, 
            (UINT32*)&par.Denominator
            );

        // Default to square pixels.
        if (FAILED(hr))
        {
            hr = MFSetAttributeRatio(
                pTypeUncomp, 
                MF_MT_PIXEL_ASPECT_RATIO, 
                1, 1
                );
        }
    }

    if (SUCCEEDED(hr))
    {
        *ppType = pTypeUncomp;
        (*ppType)->AddRef();
    }

    SafeRelease(&pTypeUncomp);
    return hr;
}

扩展的颜色信息

图像步幅

媒体类型

视频媒体类型

视频子类型 GUID