共用方式為


撰寫範例

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

當您識別並設定您要寫入之檔案的輸入時,就可以開始將範例傳遞至寫入器。 您應該盡可能以簡報時間順序傳遞範例,讓撰寫程式更有效率。

傳遞任何範例之前,您必須呼叫 IWMWriter::BeginWriting,將寫入器設定為接受它們。

若要將範例傳遞至寫入器,請執行下列步驟:

  1. 呼叫IWMWriter::AllocateSample,配置緩衝區並擷取INSSBuffer介面的指標。
  2. 藉由呼叫 INSSBuffer::GetBuffer來擷取步驟 1 中建立的緩衝區位址。
  3. 將範例資料複製到緩衝區位置,確定傳遞的樣本會符合配置的緩衝區。 您可以使用任何記憶體複製函式來複製您的資料。 常見的選擇是 memcpy,其包含在標準 C 執行時間程式庫中。
  4. 呼叫 INSSBuffer::SetLength來更新緩衝區中使用的資料量,以反映樣本的實際大小。
  5. 使用 IWMWriter::WriteSample 方法,將緩衝區介面連同輸入編號和取樣時間一起傳遞至寫入器。 輸入的所有音訊樣本都代表相同的內容持續時間,因此您可以將樣本持續時間新增至執行中總計,以找出取樣時間。 針對影片,您必須根據畫面播放速率來計算時間。

WriteSample 會以非同步方式運作,而且在應用程式準備好再次呼叫 方法之前,可能無法完成從緩衝區寫入資料。 因此,請務必針對WriteSample 的每個呼叫呼叫一次 AllocateSample 不過,您可以在呼叫WriteSample之後立即釋放INSSBuffer介面。

當您完成傳遞範例之後,請呼叫 IWMWriter::EndWriting

注意 請務必將檔案中所有資料流程的樣本傳遞至寫入器,以彼此同步處理。 也就是說,盡可能在 IWMWriterAdvanced::SetSyncTolerance中指定的同步容錯範圍內,將樣本傳遞至寫入器。 將資料以一秒或更少單位傳遞至每個資料流程時,可達到最佳結果。

資料流程也應該以大約相同的時間結束。 例如,您不應該撰寫具有 45 秒長音訊資料流程的檔案,以及長度為 50 秒的視訊串流。 如果您使用未變更的輸入來編碼這類檔案,即使它是較短的資料流程) ,資料流程結尾的一些音訊資料仍會卸載 (。 若要讓檔案編碼正常運作,您應該將 5 秒無聲新增至音訊輸入,讓一個資料流程不會在另一個資料流程之前結束數秒。 不需要有間歇性樣本的資料流程類型,例如文字或影像資料流程,以這種方式填補。 指令碼命令資料流程也應該遵循所有這些規則。

INSSBuffer 介面

IWMWriter 介面

撰寫 ASF 檔案