共用方式為


將專案寫入檔案

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

[此 API 不受支援,未來可能會變更或無法使用。]

本文說明如何將 DirectShow Editing Services 專案寫入檔案。 首先,它會描述如何使用基本轉譯引擎來撰寫檔案。 然後,它會描述智慧轉譯引擎的智慧型重新壓縮。

如需 DirectShow Editing Services 如何轉譯專案的概觀,請參閱 關於轉譯引擎

使用基本轉譯引擎

從建置圖形的前端開始,如下所示:

  1. 建立轉譯引擎。
  2. 指定時程表。
  3. 設定轉譯範圍。 (選用)
  4. 建置圖形的前端。

下列程式碼範例顯示這些步驟。

IRenderEngine *pRender = NULL; 
hr = CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC,
    IID_IRenderEngine, (void**) &pRender);

hr = pRender->SetTimelineObject(pTL);
hr = pRender->ConnectFrontEnd( );

接下來,將多工器和檔案寫入篩選器新增至篩選圖形。 若要這樣做,最簡單的方式是使用 擷取圖形產生器,這是用來建置擷取圖形的 DirectShow 元件。 擷取圖形產生器會公開 ICaptureGraphBuilder2 介面。 執行下列步驟:

  1. 建立擷取圖形產生器的實例。
  2. 取得圖形的指標,並將它傳遞給圖形產生器。
  3. 指定輸出檔的名稱和媒體類型。 此步驟也會取得多工篩選器的指標,稍後需要此指標。

下列程式碼範例顯示這些步驟。

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);

最後,將前端上的輸出針腳連接到多工篩選器。

  1. 擷取群組數目。
  2. 針對每個針腳,取得針腳的指標。
  3. 您可以選擇性地建立壓縮篩選的實例,以壓縮資料流程。 冰箱的類型將取決於群組的媒體類型。 您可以使用 系統裝置列舉值 來列舉可用的壓縮篩選器。 如需詳細資訊,請參閱 列舉裝置和篩選
  4. 選擇性地設定壓縮參數,例如主要畫面格速率。 本文稍後會詳細討論此步驟。
  5. 呼叫 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 介面,如先前所述。
  • 當您轉譯輸出釘選時,不需要插入壓縮篩選器。 資料流程已經壓縮。

轉譯專案