Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfayla ilişkilendirilmiş özellik, DirectShow , eski bir özelliktir. Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda, yeni kodun DirectShowyerine MediaPlayer, IMFMediaEngine ve Media Foundation'daki Audio/Video Capture kullanmasını kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]
Bu makalede, bir filtrenin nasıl örnek teslimdiği açıklanmaktadır. Hem IMemInputPin yöntemlerini kullanarak gönderme modelini hem de IAsyncReaderkullanarak çekme modelini açıklar.
İtme Modeli: Örnek Teslimatı
Çıkış pini, IMemInputPin::Receive yöntemini veya IMemInputPin::ReceiveMultiple yöntemini çağırarak bir örnek sunar. Bu yöntem eşdeğerdir ancak bir dizi örnek sunar. Giriş pini Alma (veya ÇokluAlma) içinde engellenebilir. Pin engelleyebilirse, IMemInputPin::ReceiveCanBlock yöntemi S_OK döndürmelidir. Pin hiçbir zaman engellemeyecekse, ReceiveCanBlock S_FALSE döndürmelidir. S_OK dönüş değeri, Alma'nin her zaman bloke etmediği anlamına gelir; yalnızca bunun olabileceği anlamına gelir.
Alma kaynağın kullanılabilir olmasını beklemesini engelleyebilir, ancak yukarı akış filtresinden daha fazla veri beklemesini engellememelidir. Bunun yapılması, yukarı akış filtresinin aşağı akış filtresinin veriyi serbest bırakmasını beklediği bir durum olan bir kilitlenmeye neden olabilir ve aşağı akış filtresi yukarı akış filtresini beklediğinden bu durum hiçbir zaman gerçekleşmez. Ancak bir filtrede birden çok giriş pini varsa, bir pin başka bir pinin veri almasını bekleyebilir. Örneğin, AVI Mux filtresi, ses ve video verilerini birbirine karıştırabilmek için bunu yapar.
Pin bir örneği çeşitli nedenlerle reddedebilir:
- İğne durulanıyor (bkz. Durulama).
- Pin bağlı değil.
- Filtre durduruldu.
- Başka bir hata oluştu.
Receive yöntemi ilk durumda S_FALSE ve diğer durumlarda bir hata kodu döndürmelidir. Dönüş kodu S_OK dışında bir şey olduğunda yukarı akış filtresi örnekleri göndermeyi durdurmalıdır.
Örnek almak için filtrenin yanlış durumda olması nedeniyle ilk üç durumun "beklenen" hatalar olduğunu düşünebilirsiniz. Beklenmedik bir arıza, pin alma modunda olsa bile pinin bir örneği reddetmesine yol açan bir arıza olabilir. Bu tür bir hata oluştuğunda, pin akış sonu bildirimini aşağı yönde göndermeli ve Filter Graph Manager'a bir EC_ERRORABORT olayı iletmelidir.
DirectShow temel sınıflarında CBaseInputPin::CheckStreaming yöntemi genel hata durumlarını (temizleme, durdurma vb.) denetler. Türetilmiş sınıfın filtreye özgü hataları denetlemesi gerekir. Bir hata durumunda CBaseInputPin::Receive yöntemi akış sonu bildirimini ve EC_ERRORABORT olayını gönderir.
Çekme Modeli: Örnek İsteme Talebi
IAsyncReader arabiriminde, giriş pini aşağıdaki yöntemlerden birini çağırarak çıkış pininden örnekler istemektedir:
İstek yöntemi zaman uyumsuzdur; giriş pini, isteğin tamamlanmasını beklemek için IAsyncReader::WaitForNext çağırır. Diğer iki yöntem eşzamanlı.
Verilerin Ne Zaman Teslim Edileceği
Bir filtre her zaman çalışır durumdayken örnekleri teslim eder. Çoğu durumda, bir filtre duraklatıldığında da örnekler sağlar. Bu, grafın verileri yönlendirmesini sağlar; böylece Çalıştır çağrıldığında kayıttan yürütme hemen başlar (bkz. Filtre Durumları). Filtreniz duraklatılmış durumdayken veri teslim etmiyorsa, filtrenin IMediaFilter::GetState yöntemi duraklatılmış durumda VFW_S_CANT_CUE döndürmelidir. Bu dönüş kodu, filtre grafiğinin duraklatma geçişini tamamlamadan önce filtrenizdeki verileri beklememesini bildirir. Aksi takdirde, Pause yöntemi süresiz olarak engellenir. Örneğin kod, bkz. CBaseFilter::GetState.
Bir filtrenin ne zaman VFW_S_CANT_CUE döndürmesi gerekebileceğine dair bazı örnekler aşağıda verilmiştir:
- Yakalama filtreleri gibi canlı kaynaklar duraklatılırken veri göndermemelidir. Bkz. Yakalama Filtresinde Veri Üretme.
- Ayırıcı filtresi, uygulama biçimine bağlı olarak duraklatıldığında veri gönderebilir veya göndermeyebilir. Filtre, her çıkış pininde verileri sıraya almak için ayrı iş parçaları kullanıyorsa duraklatıldığında veri gönderebilir. Ancak filtre her çıkış pini için tek bir iş parçacığı kullanıyorsa, ilk pin Receiveçağırdığında iş parçacığını engelleyebilir ve bu da diğer pinlerin veri göndermesini engeller. Bu durumda, VFW_S_CANT_CUE döndürmelisiniz.
- Bir filtre verileri düzensiz bir şekilde teslim edebilir. Örneğin, özel bir veri akışını ayrıştırabilir ve bazı paketleri filtrelerken diğerlerini teslim edebilir. Bu durumda, filtre duraklatıldığında veri teslimatı garanti edilmeyebilir.
Kaynak filtresi (gönderme modelini kullanarak) veya ayrıştırıcı filtresi (gönderme/çekme modelini kullanarak) bir veya daha fazla akış iş parçacığı oluşturur ve bu da örnekleri mümkün olan en kısa sürede sunar. Kod çözücüler ve dönüşümler gibi aşağı akış filtreleri genellikle yalnızca giriş pinlerinde Alma çağrıldığında veri gönderir.
İlgili konular