Membaca File dengan Pembaca Sinkron

Anda dapat menggunakan pembaca sinkron untuk membaca file ASF menggunakan panggilan sinkron alih-alih metode asinkron di objek pembaca. Menggunakan panggilan sinkron mengurangi jumlah utas yang diperlukan untuk membaca file. Pembaca asinkron menggunakan beberapa utas untuk memproses aliran. Untuk file dengan beberapa aliran, jumlah utas yang digunakan dapat menjadi sangat besar. Pembaca sinkron hanya menggunakan satu utas.

Pembaca sinkron dirancang untuk memenuhi kebutuhan pembuatan konten dan aplikasi pengeditan file. Anda dapat menggunakan pembaca sinkron untuk aplikasi lain, tetapi fungsinya terbatas.

Pembaca sinkron dapat membuka file yang lokal, atau file pada jaringan menggunakan nama jalur UNC (seperti "\\someshare\somedirectory\somefile.wmv"). Anda tidak dapat mengalirkan file ke pembaca sinkron, atau membuka file dari lokasi Internet. Pembaca sinkron juga menyediakan dukungan untuk menggunakan antarmuka IStream COM sebagai sumber.

Pembaca sinkron memberikan lebih banyak fleksibilitas untuk mengambil sampel dari file ASF daripada pembaca asinkron. Pembaca sinkron dapat mengirimkan sampel berdasarkan nomor aliran serta oleh output. Sampel yang dikirimkan oleh nomor aliran dapat dikompresi atau tidak dikompresi. Pembaca sinkron juga dapat beralih antara pengiriman terkompresi dan tidak terkompresi selama pemutaran; fitur ini dikenal sebagai "pengeditan cepat." Fitur ini memungkinkan aplikasi pengeditan untuk membaca konten berbasis media Windows dan meneruskannya langsung ke penulis sampai bingkai yang diinginkan tercapai. Pada saat itu aplikasi dapat memberi tahu pembaca untuk mulai mengirimkan konten yang tidak dikompresi, yang kemudian dapat dimodifikasi dan diteruskan ke penulis untuk kompresi ulang. Ketika aplikasi telah selesai memodifikasi bingkai yang ditentukan, aplikasi dapat memberi tahu pembaca untuk mulai mengirimkan bingkai terkompresi lagi.

Fungsionalitas paling dasar dari objek pembaca sinkron dapat dipecah menjadi langkah-langkah berikut. Dalam langkah-langkah ini "aplikasi" mengacu pada program yang Anda tulis menggunakan SDK Format Media Windows.

  1. Aplikasi meneruskan ke pembaca sinkron nama file untuk dibaca. Saat pembaca sinkron membuka file, pembaca sinkron menetapkan nomor output untuk setiap aliran. Jika file menggunakan pengecualian bersama, pembaca menetapkan satu output untuk semua aliran yang saling eksklusif.
  2. Aplikasi ini mendapatkan informasi tentang konfigurasi berbagai output dari pembaca. Informasi yang dikumpulkan akan memungkinkan aplikasi untuk merender sampel media dengan benar.
  3. Aplikasi mulai meminta sampel, satu per satu, dari pembaca sinkron. Pembaca sinkron memberikan setiap sampel dalam objek buffer yang memberikan antarmuka INSSBuffer .
  4. Aplikasi ini bertanggung jawab untuk merender data setelah dikirimkan oleh pembaca. SDK Format Media Windows tidak menyediakan rutinitas penyajian apa pun. Biasanya, aplikasi akan menggunakan SDK lain untuk merender data, seperti Microsoft Direct X SDK, atau fungsi multimedia microsoft SDK Platform Windows.

Langkah-langkah ini diilustrasikan dalam aplikasi sampel WMSyncReader. Untuk informasi selengkapnya, lihat Aplikasi Sampel.

Pembaca sinkron juga mendukung fungsionalitas yang lebih canggih. Pembaca sinkron memungkinkan Anda melakukan hal berikut:

  • Tentukan rentang sampel yang akan diambil menurut waktu atau menurut nomor bingkai.
  • Mengontrol pemilihan aliran untuk aliran yang saling eksklusif.
  • Buka file menggunakan antarmuka COM standar, IStream.
  • Membaca data profil dari header file.
  • Membaca metadata dari header file.
  • Beralih antara sampel aliran dan output selama pemutaran.
  • Beralih antara sampel aliran terkompresi dan tidak dikompresi selama pemutaran.

Bagian berikut menjelaskan penggunaan objek pembaca sinkron secara rinci.

Contoh Kode

Contoh kode berikut menunjukkan cara membaca sampel dari file ASF menggunakan pembaca sinkron. Ini menentukan dengan nomor bingkai rentang sampel untuk dikirimkan.

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   hr = pSyncReader->GetNextSample(0,
                                   &pMyBuffer,
                                   &cnsSampleTime,
                                   &cnsSampleDuration,
                                   &dwFlags,
                                   &dwOutputNumber,
                                   NULL);

   if(SUCCEEDED(hr))
   {
      // TODO: Process the sample in whatever way is appropriate 
      // to your application. When finished, clean up.
      pMyBuffer->Release();
      pMyBuffer = NULL;
      cnsSampleTime     = 0;
      cnsSampleDuration = 0;
      dwFlags           = 0;
      dwOutputNumber    = 0;
   }
} 
while (SUCCEEDED(hr));

pSyncReader->Release();
pSyncReader = NULL;

Antarmuka IWMSyncReader

Membaca File ASF

Objek Pembaca Sinkron