共用方式為


未壓縮的視訊媒體類型

本主題描述如何建立描述未壓縮視訊格式的媒體類型。 如需媒體類型一般的詳細資訊,請參閱 關於媒體類型

若要建立完整的未壓縮視訊類型,請在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 像素外觀比例。

 

此外,如果您知道正確的值,請設定下列屬性。 (否則,請省略這些屬性。

屬性 描述
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;
}

擴充色彩資訊

Image Stride

媒體類型

視訊媒體類型

影片子類型 GUID