Bagikan melalui


Format Waktu Untuk Perintah Pencarian

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan 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 Pengambilan Audio/Video 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.]

Banyak metode dalam antarmuka IMediaSeeking memiliki parameter yang mengekspresikan nilai posisi, seperti posisi saat ini atau posisi berhenti. Secara default, parameter ini dinyatakan dalam satuan 100 nanodetik, juga disebut waktu referensi. Filter apa pun yang dapat mencari harus mendukung pencarian berdasarkan waktu referensi. Beberapa filter juga dapat mencari menggunakan unit waktu lain, seperti mencari nomor bingkai tertentu, atau mencari offset byte tertentu dalam aliran. Masing-masing unit waktu ini disebut format waktu, dan didefinisikan oleh pengidentifikasi unik global (GUID). Untuk daftar format waktu yang ditentukan oleh DirectShow, lihat Format Waktu GUID. Pihak ketiga juga dapat menentukan GUID untuk format waktu kustom.

Untuk menentukan apakah filter yang saat ini berada dalam grafik filter mendukung format waktu tertentu, panggil metode IMediaSeeking::IsFormatSupported . Metode mengembalikan S_OK jika format didukung. Jika tidak, kode kesalahan akan menampilkan S_FALSE atau kode kesalahan. Jika format didukung, Anda dapat beralih ke format tersebut dengan memanggil metode IMediaSeeking::SetTimeFormat . Jika metode SetTimeFormat berhasil, perintah pencarian berikutnya dinyatakan menggunakan format waktu baru.

Contoh berikut memeriksa apakah grafik mendukung pencarian berdasarkan nomor bingkai. Jika demikian, ia berusaha untuk membingkai nomor 20:

hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
    hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
    if (SUCCEEDED(hr))
    {
        // Seek to frame number 20.
        LONGLONG rtNow = 20;
        hr = pSeek->SetPositions(
            &rtNow, AM_SEEKING_AbsolutePositioning, 
            0, AM_SEEKING_NoPositioning);
    }
}

Perhatikan bahwa format waktu hanya berlaku untuk perintah pencarian. Ini tidak memengaruhi pemutaran grafik atau tindakan lainnya.