共用方式為


配置設定檔和其他檔案屬性 (QASF)

[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器接收寫入器已取代它。 來源讀取器接收寫入器 已針對 Windows 10 和 Windows 11 優化。 Microsoft強烈建議新程式碼盡可能使用 Source ReaderSink Writer,而不是使用 Windows Media Format 11 SDK。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

下列專案描述如何執行與建立 ASF 檔案相關的各種工作。

建立個人檔案 (QASF)

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

新增元資料 (QASF)

若要將元數據新增至檔案,請從 WM ASF 寫入器 上的 IBaseFilter 介面呼叫 QueryInterface,以擷取 IWMHeaderInfo 介面。 取得配置文件之後,請使用 IWMHeaderInfo 介面方法來寫入元數據。

文件建立索引(QASF)

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

執行 Two-Pass 編碼(QASF)

只有第 8 版和更新版本的 Windows 媒體編解碼器才支援雙階段編碼。 藉由呼叫 IConfigAsfWriter2::SetParam,並在 dwParam 參數中指定AM_CONFIGASFWRITER_PARAM_MULTIPASS,並在 dwParam1 參數中指定 TRUE,將 WM ASF 寫入器放入前置處理模式。

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

如果您想要將過濾器完全排除在前置處理模式外,只需呼叫 IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS,FALSE)。

重要

應用程式有責任根據將用於編碼的配置檔來啟用前置處理模式。 某些配置檔需要雙階段編碼;如果您嘗試使用這類配置檔編碼檔案,且未將AM_CONFIGASFWRITER_PARAM_MULTIPASS設定為TRUE,則會產生EC_USERABORT錯誤。 如需如何判斷指定設定檔是否需要雙階段編碼的詳細資訊,請參閱 使用 Two-Pass 編碼寫入變數比特率數據流

 

在執行時間取得與設定緩衝區屬性 (QASF)

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

使用 IAMWMBufferPass 介面,向處理視訊流的釘腳註冊回調函數。 當 pin 呼叫您的 IAMWMBufferPassCallback::Notify 方法時,請檢查緩衝區上的時間戳,如果適當的話,請呼叫 INSSBuffer3::SetProperty,將緩衝區上的 WM_SampleExtensionGUID_OutputCleanPoint 屬性設定為 TRUE

非方形像素支援(QASF)

WM ASF 寫入器會連線到上游篩選器,例如 DV 譯碼器之類的元件,其會輸出像素縱橫比資訊。 WM ASF 寫入器會將此資訊寫入檔案中每個範例的數據單位延伸模組。

當WM ASF讀取器在檔案標頭或範例的數據單元延伸模組中遇到像素比例資訊時,它會在其輸出連接埠上提供 VIDEOINFOHEADER2 媒體類型作為首選。 dwPictAspectRatioXdwPictAspectRatioY 是這個結構中描述視訊矩形縱橫比的成員,將會正確調整以考慮像素縱橫比。

保持交錯格式

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

  • 實作支援 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 = pNSSBuffer3->SetProperty(WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size);
           
  • 在將設定檔傳遞到篩選器之前,請先在設定檔上設定資料單元擴充功能。
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
  • 使用設定檔設定篩選之後,請從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));