Sumber Langsung

[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.]

Sumber langsung, juga disebut sumber pendorongan, menerima data secara real time. Contohnya termasuk pengambilan video dan siaran jaringan. Secara umum, sumber langsung tidak dapat mengontrol laju di mana data tiba.

Filter dianggap sebagai sumber langsung jika salah satu dari berikut ini benar:

Jika filter sumber langsung menyediakan jam, Filter Graph Manager akan lebih memilih jam tersebut saat memilih jam referensi grafik. Lihat Jam Referensi untuk informasi selengkapnya.

Latensi

Latensi filter adalah jumlah waktu yang diperlukan filter untuk memproses sampel. Untuk sumber langsung, latensi ditentukan oleh ukuran buffer yang digunakan untuk menyimpan sampel. Misalnya, grafik filter memiliki sumber video dengan latensi 33 milidetik (mdtk) dan sumber audio dengan latensi 500 mdtk. Setiap bingkai video tiba di perender video sekitar 470 md sebelum sampel audio yang cocok mencapai perender audio. Kecuali grafik mengimbangi perbedaannya, audio dan video tidak akan disinkronkan.

Sumber langsung dapat disinkronkan melalui antarmuka IAMPushSource . Filter Graph Manager tidak menyinkronkan sumber langsung kecuali aplikasi mengaktifkan sinkronisasi dengan memanggil metode IAMGraphStreams::SyncUsingStreamOffset . Jika sinkronisasi diaktifkan, Filter Graph Manager meminta setiap filter sumber untuk IAMPushSource. Jika filter mendukung IAMPushSource, Filter Graph Manager memanggil IAMLatency::GetLatency untuk mengambil latensi filter yang diharapkan. (Antarmuka IAMPushSource mewarisi IAMLatency.) Dari nilai latensi gabungan, Filter Graph Manager menentukan latensi maksimum yang diharapkan dalam grafik. Kemudian memanggil IAMPushSource::SetStreamOffset untuk memberi setiap filter sumber offset aliran, yang ditambahkan filter ke stempel waktu yang dihasilkannya.

Metode ini ditujukan terutama untuk pratinjau langsung. Namun, perhatikan bahwa pin pratinjau pada perangkat pengambilan langsung (seperti kamera) tidak mengatur stempel waktu pada sampel yang dikirimkannya. Oleh karena itu, untuk menggunakan metode ini dengan perangkat penangkapan langsung, Anda harus melihat pratinjau dari pin pengambilan. Untuk informasi selengkapnya, lihat Filter DirectShow Video Capture.

Saat ini antarmuka IAMPushSource didukung oleh filter Pengambilan VFW dan filter Tangkapan Audio .

Pencocokan Laju

Jika filter perender menjadwalkan sampel menggunakan satu jam referensi, tetapi filter sumber menghasilkannya menggunakan jam yang berbeda, gangguan dapat terjadi dalam pemutaran. Perender mungkin berjalan lebih cepat daripada sumbernya, menyebabkan celah dalam data. Atau mungkin berjalan lebih lambat dari sumbernya, menyebabkan sampel "naik," hingga pada titik tertentu grafik akan menghilangkan sampel. Biasanya, sumber langsung tidak dapat mengontrol tingkat produksinya, jadi sebaliknya perender harus mencocokkan laju dengan sumbernya.

Saat ini, hanya perender audio yang melakukan pencocokan laju, karena gangguan dalam pemutaran audio lebih terlihat daripada gangguan dalam video. Untuk melakukan pencocokan laju, perender audio harus memilih sesuatu yang akan cocok dengan tarif. Ini menggunakan algoritma berikut:

  • Jika grafik tidak menggunakan jam referensi, perender audio tidak mencoba mencocokkan tarif. (Setiap kali grafik tidak memiliki jam referensi, sampel selalu dirender segera saat tiba.)
  • Jika tidak, jika ada jam referensi untuk grafik, perender audio memeriksa apakah ada sumber langsung di hulu, menggunakan kriteria yang dijelaskan sebelumnya. Jika tidak, perender audio tidak cocok dengan tarif.
  • Jika ada sumber langsung di hulu, dan sumber tersebut mengekspos antarmuka IAMPushSource pada pin outputnya, perender audio memanggil IAMPushSource::GetPushSourceFlags. Ini mencari salah satu bendera berikut:
    • AM_PUSHSOURCECAPS_INTERNAL_RM. Bendera ini berarti filter sumber memiliki mekanisme pencocokan tarifnya sendiri, sehingga perender audio tidak cocok dengan tarif.
    • AM_PUSHSOURCECAPS_NOT_LIVE. Bendera ini berarti filter sumber bukan benar-benar sumber langsung, meskipun mengekspos antarmuka IAMPushSource . Oleh karena itu, perender audio tidak cocok dengan tarif.
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK. Bendera ini berarti filter sumber menggunakan jam privat untuk menghasilkan stempel waktu. Dalam hal ini, perender audio cocok dengan tarif terhadap stempel waktu. (Namun, jika sampel tidak memiliki stempel waktu, perender mengabaikan bendera ini.)
  • Jika GetPushSourceFlags tidak mengembalikan bendera (nol), perilaku perender audio tergantung pada jam grafik dan apakah sampel memiliki stempel waktu:
    • Jika perender audio bukan jam grafik, DAN sampel memiliki stempel waktu, perender audio cocok dengan laju terhadap stempel waktu.
    • Jika sampel tidak memiliki stempel waktu, perender audio mencoba mencocokkan laju data audio yang masuk.
    • Jika perender audio adalah jam grafik, perender audio mencoba mencocokkan laju data masuk.

Alasan untuk kasus terakhir adalah sebagai berikut: Jika perender audio adalah jam referensi, dan filter sumber menggunakan jam yang sama untuk menghasilkan stempel waktu, maka perender audio tidak dapat mencocokkan tarif dengan stempel waktu. Jika ya, akibatnya akan mencoba mencocokkan laju dengan sendirinya, yang dapat menyebabkan jam melayang. Oleh karena itu, dalam hal ini perender cocok dengan tingkat data audio masuk.

Waktu dan Jam di DirectShow