共用方式為


設定設定檔和其他 ASF 檔案屬性

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

下列專案說明如何執行與 ASF 檔案建立相關的各種工作。 本主題中提及的一些介面記載于 Windows 媒體格式 SDK 檔中。

建立設定檔

WINDOWS 媒體格式 SDK 會詳細討論 ASF 設定檔;基本上,它們會描述 Windows Media Format 檔案的屬性,例如位元速率、資料流程的數目和類型,以及壓縮品質。 篩選準則會使用設定檔來判斷要寫入的 Windows Media Format 檔案類型、必須設定的輸入釘選數目,以及可接受的媒體類型。

若要建立自訂設定檔,請使用 Windows Media Format SDK 直接使用 WMCreateProfileManager 函式來建立設定檔管理員物件。 接下來,建立設定檔,並使用IConfigASFWriter::ConfigureFilterUsingProfile方法將它傳遞給WM ASF 寫入器。 這是使用 Windows 媒體音訊和視訊 9 系列編解碼器的設定檔來設定篩選的唯一方式。 您可以使用 IConfigASFWriter::ConfigureFilterUsingProfileGuid 方法來新增舊版編解碼器的系統設定檔。

只要新的設定檔不需要任何其他輸入針腳,您就可以在篩選的輸入針腳連接時重設設定檔。 例如,如果您將設定檔從單一輸入的音訊設定檔變更為雙輸入音訊和視訊設定檔,則只會重新連接音訊釘選,而且不會為視訊串流建立任何新的釘選。

新增中繼資料

若要將中繼資料新增至檔案,請查詢IWMHeaderInfo介面的WM ASF 寫入器篩選器。 在指定篩選準則之後,請使用 IWMHeaderInfo 介面方法來寫入中繼資料。

為檔案編制索引

WM ASF 寫入器預設會建立時態索引的檔案。 若要建立框架索引檔案,請使用 IConfigAsfWriter::SetIndexMode 方法來停用所有索引編制,然後建立檔案。 完成時,請直接使用 Windows Media Format SDK 來建立檔案的框架式索引。

Two-Pass編碼

只有第 8 版和更新版本的 Windows Media 編解碼器才支援雙傳遞編碼。 呼叫IConfigAsfWriter2::SetParam並在 dwParam 參數中指定AM_CONFIGASFWRITER_PARAM_MULTIPASS,並在dwParam1參數中指定 AM_CONFIGASFWRITER_PARAM_MULTIPASS,將 WM ASF 寫入器放入預處理器模式。

然後執行篩選圖形。 完成所有前置處理階段 (通常只會) 執行 一個前置 處理階段時,應用程式會收到篩選EC_PREPROCESS_COMPLETE事件。 收到此事件時,請使用 IMediaSeeking::SetPositions 將資料流程指標重設為開頭,然後再次執行篩選圖形。 最後一次傳遞 (通常是第二次傳遞) 之後,應用程式會收到 EC_COMPLETE 事件,表示編碼程式已完成。 如果在收到 EC_PREPROCESS_COMPLETE 事件之前取消前置處理傳遞,請先呼叫 IConfigAsfWriter2::ResetMultiPassState 來重設篩選,再嘗試執行另一個前置處理。

如果您想要將篩選完全移出前置處理模式,則只需要將AM_CONFIGASFWRITER_PARAM_MULTIPASS參數設定為 FALSE

重要

應用程式必須負責根據將用於編碼的設定檔來啟用前置處理模式。 某些設定檔需要雙階段編碼;如果您嘗試使用這類設定檔來編碼檔案,但未將AM_CONFIGASFWRITER_PARAM_MULTIPASS設為 TRUE,將會產生 EC_USERABORT 錯誤。 如需詳細資訊,請參閱 Windows 媒體格式 SDK 檔。

 

在執行時間取得和設定緩衝區屬性

在某些情況下,例如,如果您想要在寫入檔案時強制主要畫面格插入,應用程式可能需要在執行時間取得或設定 Windows Media 緩衝區的相關資訊。 WM ASF 讀取器和WM ASF 寫入器會篩選兩者都支援回呼機制,讓應用程式能夠在檔案讀取或檔案寫入期間存取每個個別媒體緩衝區上的INSSBuffer3介面。 應用程式可以使用這個介面將特定範例指定為主要畫面格、設定 SMPTE 時間代碼、指定交錯設定,或將任何類型的私人資料新增至資料流程。

使用 IAMWMBufferPass 介面,從處理視訊串流的針腳註冊回呼。 針腳會針對每個緩衝區呼叫 IAMWMBufferPassCallback::Notify 方法。

非平方圖元

WM ASF 寫入器會連接到上游篩選,例如 DV 解碼器,輸出圖元外觀比例資訊。 WM ASF 寫入器會將此資訊寫入為檔案中每個範例的資料單位延伸模組。

當 WM ASF 讀取器在檔案標頭或範例的資料單位延伸模組中遇到圖元外觀比例資訊時,它會在其輸出釘選上提供 VIDEOINFOHEADER2 格式作為第一個選項。 結構的 dwPictAspectRatioXdwPictAspectRatioY 成員描述視訊矩形的外觀比例,將會正確調整以考慮圖元外觀比例。

維護交錯格式

如果您從電視或 DV 攝影機擷取交錯視訊,如果您預期編碼的檔案在電視或其他交錯式顯示器裝置上播放,您可能會想要將原始視訊保留為獨立欄位。 (電腦監視器是漸進式掃描裝置。) 如果您將視訊取消交錯,然後在電視上重新交錯它以進行播放,將會產生一些資料遺失。 在 ASF 檔案中,交錯資訊會儲存為數據單位延伸模組,應用程式會使用先前所述的 IAMWMBufferPassCallback 方法來套用至每個範例。 若要編碼保留原始交錯設定的檔案,請遵循下列步驟:

  1. 實作支援 IAMWMBufferPassCallback 的 類別,並撰寫 Notify 函式來設定每個範例的交錯旗標。 在處理每個範例之前,WM ASF 寫入器會呼叫此函式。

    // Set to WM_CT_TOP_FIELD_FIRST if that is your format.
    BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST;
    HRESULT hr = S_OK;
    
    hr = pNSSBuffer3->SetProperty(
        WM_SampleExtensionGUID_ContentType, 
        (void*) &flag, 
        WM_SampleExtension_ContentType_Size
        );         
    
  2. 將設定檔傳遞至篩選之前,請先在設定檔上設定資料單位延伸模組。

    hr = pWMStreamConfig2->AddDataUnitExtension(
        WM_SampleExtensionGUID_ContentType, 
        WM_SampleExtension_ContentType_Size, 
        NULL, 
        0 
        );
    
  3. 使用設定檔設定篩選之後,請從 WM ASF 寫入器取得 IWMWriterAdvanced2 介面,並呼叫 SetInputSettings 方法。

    ``

    ``

    // Must do this first.
    hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile);
    
    CComPtr<IServiceProvider> pProvider;
    CComPtr<IWMWriterAdvanced2> pWMWA2;
    
    hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider),
                                             (void**)&pProvider);
    if (SUCCEEDED(hr))
    {
        hr = pProvider->QueryService(IID_IWMWriterAdvanced2,
            IID_IWMWriterAdvanced2,
            (void**)&pWMWA2);
    }
    
    BOOL pValue = TRUE;
    
    // Set the first parameter to your actual input number.
    hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding,
        WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));
    
    

在 DirectShow 中建立 ASF 檔案