Bagikan melalui


Mengatur dan Mengambil Posisi

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Grafik filter mempertahankan dua nilai posisi, posisi saat ini dan posisi berhenti. Ini didefinisikan sebagai berikut:

  • Ketika grafik berjalan, posisi saat ini adalah posisi pemutaran saat ini, relatif terhadap awal sumber. Ketika grafik dihentikan atau dijeda, posisi saat ini adalah titik di mana streaming akan dimulai pada perintah jalankan berikutnya.
  • Posisi berhenti adalah titik di mana aliran akan berakhir. Saat grafik mencapai posisi berhenti, tidak ada lagi data yang dialirkan, dan manajer grafik filter memposting peristiwa EC_COMPLETE . (Grafik tidak secara otomatis beralih ke status berhenti. Untuk informasi selengkapnya, lihat Merespons Peristiwa.)

Untuk mengambil nilai-nilai ini, panggil metode IMediaSeeking::GetPositions . Nilai yang dikembalikan selalu relatif terhadap sumber media asli. Secara default, nilai berada dalam unit waktu referensi. Dalam beberapa kasus, Anda dapat mengubah unit waktu; untuk informasi selengkapnya, lihat Format Waktu Untuk Perintah Pencarian.

Untuk mencari posisi baru atau mengatur posisi berhenti baru, panggil metode IMediaSeeking::SetPositions , seperti yang ditunjukkan dalam contoh berikut:

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

Catatan

Satu detik adalah 10.000.000 unit waktu referensi. Untuk kenyamanan, contoh mendefinisikan nilai ini sebagai ONE_SECOND. Jika Anda menggunakan pustaka kelas dasar DirectShow, UNITS konstanta memiliki nilai yang sama.

 

Parameter rtNow menentukan posisi baru saat ini. Parameter kedua adalah bendera yang menentukan cara menafsirkan rtNow. Dalam contoh ini, bendera AM_SEEKING_AbsolutePositioning menunjukkan bahwa rtNow menentukan posisi absolut dalam sumber. Oleh karena itu, grafik filter akan mencari posisi dua detik dari awal aliran. Parameter rtStop memberikan waktu berhenti. Parameter terakhir menentukan bahwa rtStop juga merupakan posisi absolut.

Untuk menentukan posisi yang relatif terhadap nilai posisi sebelumnya, gunakan bendera AM_SEEKING_RelativePositioning. Untuk membiarkan salah satu nilai posisi tidak berubah, gunakan bendera AM_SEEKING_NoPositioning. Parameter waktu yang sesuai dapat berupa NULL dalam kasus tersebut. Contoh berikut mencari maju 10 detik tetapi membiarkan posisi berhenti tidak berubah:

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

Jika grafik filter dihentikan, perender video tidak memperbarui gambar setelah operasi pencarian. Kepada pengguna, itu akan muncul seolah-olah pencarian tidak terjadi. Untuk memperbarui gambar, jeda grafik setelah operasi pencarian. Menjeda grafik memberi iseng bingkai video baru untuk perender video. Anda dapat menggunakan metode IMediaControl::StopWhenReady , yang menjeda grafik dan kemudian menghentikannya.