Membaca File dengan Pembaca Sinkron
[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]
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 Windows Media 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 Windows Media Format SDK.
- 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.
- Aplikasi ini mendapatkan informasi tentang konfigurasi berbagai output dari pembaca. Informasi yang dikumpulkan akan memungkinkan aplikasi untuk merender sampel media dengan benar.
- Aplikasi mulai meminta sampel, satu per satu, dari pembaca sinkron. Pembaca sinkron memberikan setiap sampel dalam objek buffer yang memberikan antarmuka INSSBuffer .
- Aplikasi ini bertanggung jawab untuk merender data setelah dikirimkan oleh pembaca. Windows Media Format SDK 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.
- Untuk Membuat Pembaca Sinkron dan Membuka File
- Untuk Menemukan Nomor Aliran dan Nomor Output
- Untuk Mengambil Sampel Media dengan Pembaca Sinkron
- Untuk Mencari Berdasarkan Waktu Menggunakan Pembaca Sinkron
- Untuk Mencari Berdasarkan Nomor Bingkai Menggunakan Pembaca Sinkron
- Untuk Mencari Berdasarkan Kode Waktu SMPTE Menggunakan Pembaca Sinkron
- Untuk Mengambil Sampel Aliran dengan Pembaca Sinkron
- Untuk Mengambil Sampel Terkompresi dengan Pembaca Sinkron
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;
Topik terkait