(QASF) 設定設定檔和其他檔案屬性
下列專案說明如何執行與 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 Media Format SDK 來建立檔案的框架式索引。
(QASF) 執行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 來重設篩選,再嘗試執行另一個前置處理。
如果您想要將篩選完全移出前置處理模式,則只需要呼叫 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 介面,從處理視訊串流的針腳註冊回呼。 當針腳呼叫 IAMWMBufferPassCallback::Notify 方法時,請檢查緩衝區上的時間戳記,如果適當的話,請呼叫 INSSBuffer3::SetProperty 將緩衝區上的 WM_SampleExtensionGUID_OutputCleanPoint 屬性設定為 TRUE。
(QASF) 的非平方圖元支援
WM ASF 寫入器會連接到上游篩選,例如 DV 解碼器,輸出圖元外觀比例資訊。 WM ASF 寫入器會將此資訊寫入為檔案中每個範例的資料單位延伸模組。
當 WM ASF 讀取器在檔案標頭或範例的資料單位延伸模組中遇到圖元外觀比例資訊時,它會在其輸出釘選上提供 VIDEOINFOHEADER2 媒體類型做為其第一個選擇。 結構的 dwPictAspectRatioX 和 dwPictAspectRatioY 成員描述視訊矩形的外觀比例,將會正確調整以考慮圖元外觀比例。
維護交錯格式
如果您從電視或 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));