共用方式為


複製資料流程而不解壓縮資料

將資料流程從一個檔案複製到另一個檔案的最簡單且最常見的方式,是擷取其壓縮狀態的樣本,然後將它們寫入新檔案,而不解壓縮並重新壓縮。 從其壓縮狀態的檔案取得的樣本稱為串流範例,因為它們在資料流程中的標記法並未變更。 建議您一律使用資料流程範例來複製資料流程,因為解壓縮和重新壓縮數位媒體資料會降低品質。 如果您必須從解壓縮的資料複製資料流程,請參閱 使用解壓縮的範例複製資料流程

您可以使用壓縮的樣本,將兩個或多個資料流程串連至單一資料流程,但只有在位元速率相同時。 此程式基本上與下面所述的步驟相同,不同之處在于您必須讀取多個原始檔案,才能取得您需要的所有內容。 不過,如果 WM_MEDIA_TYPE 結構 (包含所有壓縮資料流程的所有 pbFormat 結構成員) ,則您只能將多個檔案的壓縮樣本寫入單一資料流程。 若要結合多個非相同格式資料流程的資料,您必須解壓縮內容,並將其重新壓縮至目的地資料流程。 此外,當您將資料從兩個或多個資料流程合併成單一資料流程時,您必須將所有資料流程的緩衝區視窗值新增在一起,以取得新資料流程的緩衝區視窗。 這是因為無法判斷一個資料流程結尾和另一個資料流程開頭所佔用的緩衝區數量。

您可以使用 IWMReaderAdvanced::SetReceiveStreamSamples來擷取非同步讀取器的資料流程範例。 串流範例會傳遞至 IWMReaderCallbackAdvanced::OnStreamSample,而不是傳遞至 IWMReaderCallback::OnSample。 如果您要讀取檔案並擷取壓縮的資料流程和一些解壓縮的資料流程,則必須實作這兩個回呼方法。

同步讀取器提供更多擷取樣本的彈性。 您可以使用 IWMSyncReader::SetReadStreamSamples在播放期間自由切換壓縮和解壓縮的樣本。

若要將整個資料流程從一個 ASF 檔案複製到新的 ASF 檔案,請執行下列步驟。 這些步驟會使用同步讀取器,因為對這類作業使用比較簡單。

  1. 藉由呼叫 WMCreateSyncReader 函式來建立同步讀取器物件。
  2. 在讀取器中開啟檔案,並呼叫 IWMSyncReader::Open
  3. 呼叫IWMSyncReader::QueryInterface,以取得同步讀取器物件的IWMProfile介面指標。
  4. 藉由呼叫 IWMProfile::GetStreamByNumber來擷取所需資料流程的屬性。 這會擷取所要資料流程之資料流程組態物件的 IWMStreamConfig 介面指標。
  5. 取得資料流程 WM_MEDIA_TYPE 結構的複本。 對 IWMMediaProps::GetMediaType進行兩次呼叫:第一個呼叫以取得結構的大小,第二個呼叫以取得結構本身。
  6. 藉由呼叫 WMCreateProfileManager 函式來建立設定檔管理員物件。
  7. 呼叫 IWMProfileManager::CreateEmptyProfile 以建立新的設定檔 (或開啟您要新增資料流程的現有設定檔) 。 在新的設定檔上呼叫 IWMProfile::AddStream ,以從現有的檔案新增資料流程。 新增資料流程時,請使用步驟 4 中取得的 IWMStreamConfig 指標。
  8. 使用 WMCreateWriter 函式的呼叫建立寫入器物件。 呼叫 IWMWriter::SetProfile,將新建立的設定檔設定為寫入器中的使用中設定檔。 呼叫 IWMWriter::SetOutputFilename來建立輸出的檔案。
  9. 針對您正在複製的資料流程或資料流程相關聯的每個輸入,呼叫IWMWriter::SetInputProps,傳遞IWMInputMediaProps介面的Null。 這會通知寫入器物件,它不需要驗證您傳遞的資料。 您必須在呼叫 BeginWriting (步驟 14) 之前進行此呼叫,否則讀取物件可能無法解碼內容。
  10. 藉由呼叫 IWMSyncReader::SetReadStreamSamples並將 fCompressed 參數設為 True,設定同步讀取器以傳遞所選資料流程的壓縮資料流程範例。
  11. 取得所複製之每個資料流程的編解碼器資訊,並在撰寫之前將編解碼器資訊新增至標頭。 若要取得編解碼器資訊,請呼叫 IWMHeaderInfo2::GetCodecInfoCountIWMHeaderInfo2::GetCodecInfo 來列舉讀取器中檔案相關聯的編解碼器。 選取符合資料流程組態的編解碼器資訊。 然後呼叫 IWMHeaderInfo3::AddCodecInfo,以在寫入器中設定編解碼器資訊,並傳遞從讀取器取得的資訊。
  12. 呼叫IWMWriter::QueryInterface,以取得IWMWriterAdvanced介面的指標。
  13. 呼叫 IWMWriter::BeginWriting,將寫入器設定為寫入模式。
  14. IWMSyncReader::GetNextSample進行重複呼叫,並指定所需的資料流程編號。 收到樣本時,請透過呼叫 IWMWriterAdvanced::WriteStreamSample將它們傳遞至寫入器。 對於視訊串流,您應該在每個呼叫 GetNextSample時檢查寫入器所設定的旗標 (是否有任何) 。 如果已設定WM_SF_CLEANPOINT,您也必須在呼叫 WriteStreamSample時加以設定。
  15. 讀取完成時,請呼叫 IWMWriter::EndWriting。 資料流程應該傳輸。

注意

影像資料流程無法使用資料流程範例,從一個檔案複製到另一個檔案。 若要複製影像資料流程資料,請擷取未壓縮的樣本,然後像平常一樣透過寫入器加以處理。

 

將資料從一個檔案複製到另一個檔案

使用解壓縮的範例複製資料流程