Menyalin Aliran Tanpa Mendekompresi Data

Cara paling sederhana dan paling umum untuk menyalin aliran dari satu file ke file lainnya adalah dengan mengambil sampel dalam status terkompresi mereka dan kemudian menulisnya ke file baru tanpa mendekompresi dan mengompresinya kembali. Sampel yang diperoleh dari file dalam status terkompresi disebut sampel aliran, karena tidak diubah dari representasinya di aliran. Disarankan agar Anda selalu menggunakan sampel aliran untuk menyalin aliran, karena mendekompresi dan mengompresi data media digital menurunkan kualitas. Jika Anda harus menyalin aliran dari data yang didekompresi, lihat Menyalin Aliran Menggunakan Sampel yang Didekompresi.

Dimungkinkan untuk menggabungkan dua aliran atau lebih ke dalam satu aliran menggunakan sampel terkompresi, tetapi hanya jika laju bit identik. Proses ini pada dasarnya sama dengan langkah-langkah yang dijelaskan di bawah ini, kecuali bahwa Anda harus membaca beberapa file asli untuk mendapatkan semua konten yang Anda butuhkan. Namun, Anda hanya dapat menulis sampel terkompresi dari beberapa file ke satu aliran jika struktur WM_MEDIA_TYPE (termasuk semua anggota struktur pbFormat ) dari semua aliran terkompresi identik. Untuk menggabungkan data dari beberapa aliran yang tidak memiliki format yang sama, Anda harus mendekompresi konten dan mengompresinya kembali ke aliran tujuan. Selain itu, ketika Anda menggabungkan data dari dua aliran atau lebih ke dalam satu aliran, Anda harus menambahkan nilai jendela buffer untuk semua aliran bersama-sama untuk mendapatkan jendela buffer untuk aliran baru. Ini karena tidak mungkin untuk menentukan berapa banyak buffer yang diambil di akhir satu aliran dan di awal yang lain.

Anda dapat mengambil sampel aliran dengan pembaca asinkron menggunakan IWMReaderAdvanced::SetReceiveStreamSamples. Sampel stream dikirimkan ke IWMReaderCallbackAdvanced::OnStreamSample, bukan ke IWMReaderCallback::OnSample. Jika Anda membaca file dan mengambil beberapa aliran yang dikompresi dan beberapa didekompresi, Anda harus menerapkan kedua metode panggilan balik.

Pembaca sinkron memberikan lebih banyak fleksibilitas untuk mengambil sampel. Anda dapat beralih antara sampel yang dikompresi dan didekompresi secara bebas selama pemutaran menggunakan IWMSyncReader::SetReadStreamSamples.

Untuk menyalin seluruh aliran dari satu file ASF ke file ASF baru, lakukan langkah-langkah berikut. Langkah-langkah ini menggunakan pembaca sinkron karena jauh lebih mudah digunakan untuk operasi semacam ini.

  1. Buat objek pembaca sinkron dengan memanggil fungsi WMCreateSyncReader .
  2. Buka file di pembaca dengan panggilan ke IWMSyncReader::Open.
  3. Dapatkan penunjuk ke antarmuka IWMProfile dari objek pembaca sinkron dengan memanggil IWMSyncReader::QueryInterface.
  4. Ambil properti aliran yang diinginkan dengan memanggil IWMProfile::GetStreamByNumber. Ini akan mengambil penunjuk ke antarmuka IWMStreamConfig dari objek konfigurasi aliran untuk aliran yang Anda inginkan.
  5. Dapatkan salinan struktur WM_MEDIA_TYPE untuk aliran. Lakukan dua panggilan ke IWMMediaProps::GetMediaType: yang pertama untuk mendapatkan ukuran struktur, yang kedua untuk mendapatkan struktur itu sendiri.
  6. Buat objek manajer profil dengan memanggil fungsi WMCreateProfileManager .
  7. Panggil IWMProfileManager::CreateEmptyProfile untuk membuat profil baru (atau buka profil yang sudah ada yang ingin Anda tambahkan alirannya). Panggil IWMProfile::AddStream pada profil baru untuk menambahkan aliran dari file yang ada. Saat menambahkan aliran, gunakan penunjuk IWMStreamConfig yang diperoleh di langkah 4.
  8. Buat objek penulis dengan panggilan ke fungsi WMCreateWriter . Atur profil yang baru dibuat sebagai profil aktif di penulis dengan memanggil IWMWriter::SetProfile. Buat file untuk output dengan memanggil IWMWriter::SetOutputFilename.
  9. Untuk setiap input yang terkait dengan aliran atau aliran yang Anda salin, panggil IWMWriter::SetInputProps, melewati NULL untuk antarmuka IWMInputMediaProps . Ini menginformasikan objek penulis bahwa ia tidak perlu memvalidasi data yang Anda lewati. Anda harus melakukan panggilan ini sebelum memanggil BeginWriting (langkah 14), jika tidak, objek baca mungkin tidak dapat mendekode konten.
  10. Atur pembaca sinkron untuk mengirimkan sampel aliran terkompresi untuk aliran yang dipilih dengan memanggil IWMSyncReader::SetReadStreamSamples dengan parameter fCompressed diatur ke True.
  11. Dapatkan informasi codec untuk setiap aliran yang disalin dan tambahkan informasi codec ke header sebelum menulis. Untuk mendapatkan informasi codec, panggil IWMHeaderInfo2::GetCodecInfoCount dan IWMHeaderInfo2::GetCodecInfo untuk menghitung codec yang terkait dengan file di pembaca. Pilih informasi codec yang cocok dengan konfigurasi aliran. Kemudian atur informasi codec di penulis dengan memanggil IWMHeaderInfo3::AddCodecInfo, meneruskan informasi yang diperoleh dari pembaca.
  12. Dapatkan pointer ke antarmuka IWMWriterAdvanced dengan memanggil IWMWriter::QueryInterface.
  13. Atur penulis ke mode penulisan dengan memanggil IWMWriter::BeginWriting.
  14. Lakukan panggilan berulang ke IWMSyncReader::GetNextSample, menentukan nomor aliran yang diinginkan. Ketika sampel diterima, berikan ke penulis dengan panggilan ke IWMWriterAdvanced::WriteStreamSample. Untuk streaming video, Anda harus memeriksa bendera (jika ada) yang diatur oleh penulis pada setiap panggilan ke GetNextSample. Jika WM_SF_CLEANPOINT diatur, Anda juga harus mengaturnya pada panggilan Anda ke WriteStreamSample.
  15. Saat membaca selesai, panggil IWMWriter::EndWriting. Aliran harus ditransfer.

Catatan

Aliran gambar tidak dapat disalin dari satu file ke file lainnya menggunakan sampel aliran. Untuk menyalin data aliran gambar, ambil sampel yang tidak dikompresi lalu proses melalui penulis seperti biasa.

 

Menyalin Data dari Satu File ke File Lain

Menyalin Aliran Menggunakan Sampel yang Didekompresi