資料流程格式

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

MSDV 和 UVC 驅動程式都可以輸出兩種 DV 格式:交錯的音訊視訊或僅限視訊。 交錯的音訊視訊是來自裝置的原始格式。 僅限視訊格式包含相同的資料,但範例會標示為沒有音訊資料。 僅限視訊格式主要適用于與使用 Video for Windows 的應用程式相容。 如需詳細資訊,請參閱 Type-1 與 Type-2 DV AVI 檔案

MSDV 驅動程式

MSDV 驅動程式有兩個輸出針腳。 第一個輸出針腳會傳送交錯的資料,而第二個輸出針腳則會傳送僅限視訊的資料。 一次只能連接一個輸出針腳。 若要選取格式,請連接適當的輸出釘選。 您可以使用輸出針腳上的 IAMStreamConfig 介面來尋找格式。

UVC 驅動程式

不同于 MSDV 驅動程式,UVC 驅動程式會從相同的針腳提供這兩種格式。 預設格式為僅限視訊。 若要選取格式,請使用輸出釘選上的 IAMStreamConfig 介面。 呼叫 GetStreamCaps 方法,以列舉輸出釘選上的媒體類型。 針對每個媒體類型,如果主要類型符合所需的格式,請呼叫 SetFormat 並傳入該媒體類型。

格式 主要類型
交錯的音訊和視訊 MEDIATYPE_Interleaved
僅限視訊 MEDIATYPE_Video

 

下列函式會根據主要類型 GUID 來設定格式。

HRESULT SetStreamFormat(IAMStreamConfig *pConfig, const GUID& majorType)
{
    if (pConfig == NULL)
    {
        return E_POINTER;
    }

    // Get the number of stream capabilities.
    int count = 0, size = 0;
    HRESULT hr = pConfig->GetNumberOfCapabilities(&count, &size);
    if (FAILED(hr))
    {
        return hr;
    }

    // Allocate memory for the stream capabilities structure.
    BYTE *pCaps = new BYTE[size];
    if (pCaps == NULL)
    {
        return E_OUTOFMEMORY;
    }
    
    // Enumerate the stream capabilities.
    bool bFoundType = false;
    for (int ix = 0; ix < count; ix++)
    {
        AM_MEDIA_TYPE *pmt;
        hr = pConfig->GetStreamCaps(ix, &pmt, pCaps);
        if (FAILED(hr))
        {
            break;
        }
        else if (pmt->majortype == majorType)
        {
            // This is the media type we want.
            bFoundType = true;
            hr = pConfig->SetFormat(pmt);
            DeleteMediaType(pmt);
            break;
        }
        DeleteMediaType(pmt);
    }
    delete [] pCaps;
    if (FAILED(hr))
    {
        return hr;
    }
    return bFoundType ? S_OK : E_FAIL;
}

MSDV 驅動程式也支援 IAMStreamConfig,因此您可以撰寫適用于這兩種裝置類型的程式碼。

控制 DV Camcorder