將專案寫入檔案
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
[此 API 不受支援,未來可能會變更或無法使用。]
本文說明如何將 DirectShow Editing Services 專案寫入檔案。 首先,它會描述如何使用基本轉譯引擎來撰寫檔案。 然後,它會描述智慧轉譯引擎的智慧型重新壓縮。
如需 DirectShow Editing Services 如何轉譯專案的概觀,請參閱 關於轉譯引擎。
使用基本轉譯引擎
從建置圖形的前端開始,如下所示:
- 建立轉譯引擎。
- 指定時程表。
- 設定轉譯範圍。 (選用)
- 建置圖形的前端。
下列程式碼範例顯示這些步驟。
IRenderEngine *pRender = NULL;
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC,
IID_IRenderEngine, (void**) &pRender);
hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );
接下來,將多工器和檔案寫入篩選器新增至篩選圖形。 若要這樣做,最簡單的方式是使用 擷取圖形產生器,這是用來建置擷取圖形的 DirectShow 元件。 擷取圖形產生器會公開 ICaptureGraphBuilder2 介面。 執行下列步驟:
- 建立擷取圖形產生器的實例。
- 取得圖形的指標,並將它傳遞給圖形產生器。
- 指定輸出檔的名稱和媒體類型。 此步驟也會取得多工篩選器的指標,稍後需要此指標。
下列程式碼範例顯示這些步驟。
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **)&pBuilder);
// Get a pointer to the graph front end.
IGraphBuilder *pGraph;
pRender->GetFilterGraph(&pGraph);
pBuilder->SetFiltergraph(pGraph);
// Create the file-writing section.
IBaseFilter *pMux;
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("Output.avi"), &pMux, NULL);
最後,將前端上的輸出針腳連接到多工篩選器。
- 擷取群組數目。
- 針對每個針腳,取得針腳的指標。
- 您可以選擇性地建立壓縮篩選的實例,以壓縮資料流程。 冰箱的類型將取決於群組的媒體類型。 您可以使用 系統裝置列舉值 來列舉可用的壓縮篩選器。 如需詳細資訊,請參閱 列舉裝置和篩選。
- 選擇性地設定壓縮參數,例如主要畫面格速率。 本文稍後會詳細討論此步驟。
- 呼叫 ICaptureGraphBuilder2::RenderStream。 這個方法會取得針腳的指標、壓縮篩選 (如果有任何) ,以及多工器。
下列程式碼範例示範如何連接輸出釘選。
long NumGroups;
pTimeline->GetGroupCount(&NumGroups);
// Loop through the groups and get the output pins.
for (i = 0; i < NumGroups; i++)
{
IPin *pPin;
if (pRender->GetGroupOutputPin(i, &pPin) == S_OK)
{
IBaseFilter *pCompressor;
// Create a compressor filter. (Not shown.)
// Set compression parameters. (Not shown.)
// Connect the pin.
pBuilder->RenderStream(NULL, NULL, pPin, pCompressor, pMux);
pCompressor->Release();
pPin->Release();
}
}
若要 (步驟 4 設定壓縮參數,先前) ,請使用 IAMVideoCompression 介面。 此介面會在壓縮篩選器的輸出針腳上公開。 列舉壓縮篩選器的針腳,並查詢 IAMVideoCompression的每個輸出針腳。 (如需列舉針腳的詳細資訊,請參閱 列舉 Pins.) 請務必釋放您在此步驟期間取得的所有介面指標。
建置篩選圖形之後,請在篩選圖形管理員上呼叫 IMediaControl::Run 方法。 當篩選圖表執行時,它會將資料寫入檔案。 使用事件通知等候播放完成。 (請參閱 回應 Events.) 播放完成時,您必須明確呼叫 IMediaControl::Stop 來停止篩選圖形。 否則,不會正確寫入檔案。
使用智慧轉譯引擎
若要取得智慧型重新壓縮的優點,請使用智慧轉譯引擎來取代基本轉譯引擎。 建置圖形的步驟幾乎相同。 主要差異在於壓縮是在圖形的前端處理,而不是在檔案寫入區段中處理。
重要
請勿使用智慧轉譯引擎來讀取或寫入 Windows Media 檔案。
每個視訊群組都有一個屬性,指定該群組的壓縮格式。 壓縮格式必須完全符合群組的高度、寬度、位深度和畫面播放速率的未壓縮格式。 智慧轉譯引擎會在建構圖形時使用壓縮格式。 在設定壓縮格式之前,請務必呼叫 IAMTimelineGroup::SetMediaType來設定該群組的未壓縮格式。
若要設定群組的壓縮格式,請呼叫 IAMTimelineGroup::SetSmartRecompressFormat 方法。 這個方法會採用 SCompFmt0 結構的指標。 SCompFmt0結構有兩個成員:nFormatId,必須是零,而MediaType則是AM_MEDIA_TYPE結構。 使用格式資訊初始化 AM_MEDIA_TYPE 結構。
注意
如果您希望最終專案的格式與其中一個原始程式檔相同,您可以使用媒體偵測器直接從來源檔案取得AM_MEDIA_TYPE結構。 請參閱 IMediaDet::get_StreamMediaType。
將 SCompFmt0 變數轉換成 long類型的指標,如下列範例所示。
SCompFmt0 *pFormat = new SCompFmt0;
memset(pFormat, 0, sizeof(SCompFmt0));
pFormat->nFormatId = 0;
// Initialize pFormat->MediaType. (Not shown.)
pGroup->SetSmartRecompressFormat( (long*) pFormat );
智慧轉譯引擎會自動搜尋相容的壓縮篩選器。 您也可以呼叫 ISmartRenderEngine::SetGroupCompressor來指定群組的壓縮篩選。
若要建置圖表,請使用上一節中基本轉譯引擎所述的相同步驟。 唯一的差異如下:
- 使用智慧轉譯引擎,而非基本轉譯引擎。 類別識別碼CLSID_SmartRenderEngine。
- 在建置前端之後,但在轉譯輸出釘選之前設定壓縮參數。 呼叫 ISmartRenderEngine::GetGroupCompressor 方法來取得群組壓縮篩選的指標。 然後查詢 IAMVideoCompression 介面,如先前所述。
- 當您轉譯輸出釘選時,不需要插入壓縮篩選器。 資料流程已經壓縮。
相關主題