Medya Havuzları

Medya havuzları, medya verilerini alan işlem hattı nesneleridir. Medya havuzu, bir veya daha fazla medya akışının hedefidir. Medya havuzları iki genel kategoriye ayrılır:

  • işleyici, kayıttan yürütme için veri sunan bir medya havuzudur. Gelişmiş video işleyici (EVR) video çerçevelerini görüntüler ve ses işleyici ses akışlarını ses kartı veya başka bir ses cihazı aracılığıyla çalar.

  • arşiv havuzu, bir dosyaya veya başka bir depolama alanına veri yazan bir medya havuzudur.

Aralarındaki temel fark, arşiv havuzlarının verileri sabit bir kayıttan yürütme hızında kullanmamasıdır. Bunun yerine, aldığı verileri mümkün olan en kısa sürede yazar.

Medya havuzları, IMFMediaSink arabirimini kullanıma sunar. Her medya havuzu, bir veya daha fazlaakış havuzu içerir. Her akış havuzu, verileri bir akıştan alır. Akış havuzları, IMFStreamSink arabirimini kullanıma sunar. Genellikle bir uygulama doğrudan medya havuzları oluşturmaz. Bunun yerine uygulama, Media Session'ın havuzu oluşturmak için kullandığı bir veya daha fazla etkinleştirme nesnesi oluşturur. Havuzdaki diğer tüm işlemler Medya Oturumu tarafından işlenir ve uygulama ortam havuzu veya akış havuzlarından herhangi birinde herhangi bir yöntemi çağırmaz. Etkinleştirme nesneleri hakkında daha fazla bilgi için bkz. Etkinleştirme Nesneleri.

Özel bir medya havuzu yazıyorsanız veya doğrudan Medya Oturumu olmadan bir medya havuzu kullanmak istiyorsanız, bu konunun geri kalanını okumalısınız.

Akış Havuzları

Medya havuzu sabit sayıda akış havuzuna sahip olabilir veya akış havuzlarının eklenmesini ve kaldırılmasını destekleyebilir. Sabit sayıda akış havuzu varsa, IMFMediaSink::GetCharacteristics yöntemi MEDIASINK_FIXED_STREAMS bayrağını döndürür. Aksi takdirde, akış havuzları ekleyebilir ve kaldırabilirsiniz. Yeni bir akış havuzu eklemek için IMFMediaSink::AddStreamSinköğesini çağırabilirsiniz. Bir akış havuzu kaldırmak için IMFMediaSink::RemoveStreamSinkçağrısında bulunur. MEDIASINK_FIXED_STREAMS bayrağı, medya havuzun bu iki yöntemi desteklemediğini gösterir. (Akış sayısını yapılandırmanın başka bir yolunu, örneğin havuz oluşturulduğunda başlatma parametrelerini ayarlayarak desteklenebilir.) Akış havuzlarının listesi sıralanır. Bunları dizin değerine göre numaralandırmak için IMFMediaSink::GetStreamSinkByIndex yöntemini çağırın.

Akış havuzlarının da tanımlayıcıları vardır. Akış tanımlayıcıları medya havuzu içinde benzersizdir, ancak ardışık olması gerekmez. Medya havuzuna bağlı olarak, akış tanımlayıcılarının içerikle ilgili bir anlamı olabilir. Örneğin, bir arşiv havuzu akış tanımlayıcılarını dosya üst bilgisine yazabilir. Aksi takdirde, bunlar rastgeledir. Tanımlayıcısına göre bir akış havuzu almak için, IMFMediaSink::GetStreamSinkByIdçağrısında bulunur.

Sunu Saati

Medya havuzu örnekleri kullanma hızı, Sunu Saatitarafından denetlenir. Medya Oturumu, medya havuzunun IMFMediaSink::SetPresentationClock yöntemini çağırarak sunu saatini seçer ve medya havuzuna ayarlar. Akış başlamadan önce sunu saatinin medya havuzuna ayarlanması gerekir. Her medya havuzu için bir sunu saatinin çalıştırılması gerekir. Medya havuzu, sunu saatini iki amaçla kullanır:

  • Akış başladığında veya durduğunda bildirim almak için. Medya havuzu, tüm medya havuzlarının uygulaması gereken IMFClockStateSink arabirimi aracılığıyla bu bildirimleri alır.

  • Örnekleri ne zaman işlemesi gerektiğini belirlemek için. Medya havuzu yeni bir örnek aldığında, örnekten zaman damgasını alır ve bu sunu zamanında örneği işlemeye çalışır.

Sunu saati, saat saatlerini sunu saat kaynağıadlı başka bir nesneden türetir. Sunu zamanı kaynakları, IMFPresentationTimeSource arabirimini kullanıma sunar. Bazı medya havuzları doğru bir saat erişimine sahip olduğundan bu arabirimi kullanıma sunar. Bu, bir medya havuzu kendi saati tarafından sağlanan bir zamana göre örnekler zamanlayabilir anlamına gelir. Ancak, medya havuzu bunun böyle olduğunu varsayamaz. Sunu saatinin medya havuzu tarafından mı yoksa başka bir saat tarafından mı kullanıldığına bakılmaksızın, her zaman sunu saatinden saati kullanmalıdır.

Ortam havuzu kendi saati dışında bir saatle hızları eşleştiremiyorsa GetCharacteristics yöntemi MEDIASINK_CANNOT_MATCH_CLOCK bayrağını döndürür. Bu bayrak varsa ve sunu saati farklı bir sunu zamanı kaynağı kullanıyorsa, medya havuzu büyük olasılıkla düşük performans gösterir. Örneğin kayıttan yürütme sırasında hata olabilir.

hızsız havuzu, örneklerdeki zaman damgalarını yoksayan ve her örnek gelir gelmez verileri kullanan bir medya havuzudur. Hızsız medya havuzu, getCharacteristicsyöntemindenMEDIASINK_RATELESS bayrağını döndürür. Bu bayrak genellikle arşiv havuzları için geçerlidir. İşlem hattındaki her medya havuzu hızsızsa, Medya Oturumu özel bir hızsız sunu saati kullanır. Bu saat havuzlar örnekleri tükettiği kadar hızlı çalışır.

Akış Biçimleri

Medya havuzu örnekleri alabilmesi için önce istemcinin akış havuzlarında medya türünü ayarlaması gerekir. Medya türünü ayarlamak için akış havuzu IMFStreamSink::GetMediaTypeHandler yöntemini çağırın. Bu yöntem, IMFMediaTypeHandler arabirimine bir işaretçi döndürür. Tercih edilen medya türlerinin listesini almak, geçerli medya türünü almak ve medya türünü ayarlamak için bu arabirimi kullanın.

Tercih edilen medya türlerinin listesini almak için, IMFMediaTypeHandler::GetMediaTypeByIndexöğesini çağırın. Tercih edilen türler istemciye bir ipucu olarak alınmalıdır. Liste eksik olabilir veya kısmi medya türleri içeriyor olabilir. Kısmi medya türü, geçerli bir biçimi açıklamak için gereken tüm özniteliklere sahip olmayan bir türdür. Örneğin, kısmi bir video türü renk alanını ve bit derinliğini belirtebilir, ancak görüntü genişliğini veya yüksekliğini belirtmeyebilir. Kısmi ses türü sıkıştırma biçimini ve örnek hızı belirtebilir ancak ses kanalı sayısını belirtmeyebilir.

Akış havuzundaki geçerli medya türünü almak için, IMFMediaTypeHandler::GetCurrentMediaTypeöğesini çağırın. Bir akış havuzu ilk oluşturulduğunda, önceden ayarlanmış bir varsayılan medya türü olabilir veya istemci ayarlayana kadar medya türü olmayabilir.

Medya türünü ayarlamak için IMFMediaTypeHandler::SetCurrentMediaTypeçağrısında bulunur. Bazı akış havuzları, ayarlandıktan sonra türü değiştirmeyi desteklemeyebilir. Bu nedenle, medya türlerini ayarlamadan önce test etmek yararlı olur. Medya havuzun bir medya türünü kabul edip etmeyeceğini test etmek için (türü ayarlamadan), IMFMediaTypeHandler::IsMediaTypeSupportedöğesini çağırın.

Veri Akışı

Medya havuzları birçekme modeli kullanır. Bu, akış havuzlarının ihtiyaç duydukları verileri istemesi anlamına gelir. Müşteri herhangi bir hata olmaması için zamanında yanıt vermelidir.

Bazı medya havuzları ön kaydını destekler. Ön kayıt, sunu saati başlamadan önce medya havuzuna veri verme işlemidir. Medya havuzu ön kaydı destekliyorsa, medya havuzu IMFMediaSinkPreroll arabirimini kullanıma sunar ve GetCharacteristics yöntemi MEDIASINK_CAN_PREROLL bayrağını döndürür. Ön kayıt, medya havuzu sunu saati başladığında ilk örneği sunmaya hazır olmasını sağlar. Medya havuzu destekliyorsa istemcinin her zaman ön kaydı olması önerilir, çünkü kayıttan yürütme sırasında hata veya boşluk oluşmasını önleyebilir.

Medya havuzuna veri akışı aşağıdaki gibi çalışır:

  1. İstemci, medya türlerini ve sunu saatini ayarlar. Medya havuzu, saat durumu değişiklikleriyle ilgili bildirimler almak için kendisini sunu saatine kaydeder.
  2. İsteğe bağlı olarak istemci, IMFMediaSinkPrerollsorgular. Medya havuzu bu arabirimi kullanıma sunarsa, istemci IMFMediaSinkPreroll::NotifyPrerollçağırır. Aksi takdirde, istemci 5. adıma atlar.
  3. Her akış havuzu meStreamSinkRequestSample olayları bir veya daha fazla gönderir. Bu olayların her birine yanıt olarak, istemci bu akış için bir sonraki veri örneğini alır ve IMFStreamSink::P rocessSampleçağırır.
  4. Her akış havuzu yeterli ön kayıt verisi aldığında, bir MEStreamSinkPrerolled olayı gönderir.
  5. İstemci, sunu saatini başlatmak için IMFPresentationClock::Start çağırır.
  6. Sunu saati, IMFClockStateSink::OnClockStartçağrısı yaparak medya havuzuna saatin başlatıldığını bildirir.
  7. Daha fazla veri almak için her akış havuzu MEStreamSinkRequestSample olayları gönderir. Bu olayların her birine yanıt olarak, istemci sonraki örneği alır ve ProcessSampleçağırır. Sunu bitene kadar bu adım yinelenir.

Çoğu medya havuzu örnekleri zaman uyumsuz olarak işler, böylece akış havuzları aynı anda birden fazla örnek istek gönderebilir.

Akış sırasında istemci, IMFStreamSink::P laceMarker çağırabilir ve istediğiniz zaman IMFStreamSink::Flush. İşaretçiler sonraki bölümde açıklanmıştır. Boşaltma, akış havuzun kuyruğa aldığı ancak henüz işlenmediği örnekleri bırakmasına neden olur.

İşaretleyiciler

İşaretçiler, istemcinin akıştaki belirli noktaları belirtmesi için bir yol sağlar. İşaretçi aşağıdaki bilgilerden oluşur:

  • MFSTREAMSINK_MARKER_TYPE sabit listesi üyesi olarak tanımlanan işaretçi türü.
  • İşaretçiyle ilişkili veriler. Verilerin anlamı işaretçi türüne bağlıdır. Bazı işaretçi türlerinde veri yoktur.
  • İstemcinin kendi kullanımı için isteğe bağlı veriler.

İşaretleyici yerleştirmek için istemci, IMFStreamSink::P laceMarkerçağırır. Akış havuzu, PlaceMarker çağrısından önce aldığı tüm örnekleri işlemeyi tamamlar ve ardından bir MEStreamSinkMarker olayı gönderir.

Çoğu medya havuzu, zaman uyumsuz olarak işledikleri bekleyen örneklerden oluşan bir kuyruk tutar. İşaretçi olayları örnek işleme ile seri hale getirilmelidir, bu nedenle medya havuzu işaretçileri aynı kuyruğa yerleştirmelidir. Örneğin, istemcinin aşağıdaki yöntem çağrılarını yaptığını varsayalım:

  1. ProcessSample (Örnek 1)
  2. ProcessSample (Örnek 2)
  3. PlaceMarker (İşaretçi #1)
  4. ProcessSample (Örnek #3)
  5. PlaceMarker (İşaretçi #2)

Bu örnekte akış havuzu, 2. örneği işledikten sonra işaretçi #1 için MEStreamSinkMarker olayını ve 3. örneği işledikten sonra 2. işaretçi olayını göndermelidir.

İstemci bir akış havuzu temizlerse, akış havuzu kuyruktaki tüm işaretçileri hemen işler. Durum kodunu bu olaylar üzerinde E_ABORT olarak ayarlar.

Bazı işaretçiler, medya havuzuyla ilgili bilgiler içerir:

  • MFSTREAMSINK_MARKER_TICK: Akışta bir boşluk olduğunu gösterir. Sonraki örnek bir kesinti olacaktır.
  • MFSTREAMSINK_MARKER_ENDOFSEGMENT: Bir kesimin sonunu veya akışın sonunu gösterir. Sonraki örnek (varsa) bir kesinti olabilir.
  • MFSTREAMSINK_MARKER_EVENT: Bir olay içerir. Olay türüne ve medya havuzu uygulamasına bağlı olarak, medya havuzu olayı işleyebilir veya yoksayabilir.

Durum Değişiklikleri

Medya havuzuna, medya havuzu IMFClockStateSink arabirimi aracılığıyla sunu saatinde durum değişiklikleri bildirilir. İstemci sunu saatini ayarlarken medya havuzu, kendisini saatteki bildirimlere kaydetmek için IMFPresentationClock::AddClockStateSink çağırır. Aşağıdaki tabloda, ortam havuzu saat durumu değişikliklerine yanıt olarak nasıl davrandığını özetlemektedir.

Saat durumu değişikliği Örnek işleme İşaretçi işleme
OnClockStart Zaman damgası saat başlangıç zamanına eşit veya daha geç olan işlem örnekleri. İşaretçi işlenmeden önce alınan tüm örnekler işlendiğinde MEStreamSinkMarker olayını gönderin.
OnClockPause Medya havuzu duraklatılırken ProcessSamplebaşarısız olabilir.
Medya havuzu duraklatılan örnekleri kabul ederse, saat yeniden başlatılana kadar bunları kuyruğa alması gerekir. Duraklatılmış durumdayken kuyruğa alınan örnekleri işlemeyin.
Kuyruğa alınmış örnekler varsa, işaretçileri aynı kuyruğa yerleştirin. Saat yeniden başlatıldığında işaretçi olayını gönderin.
Aksi takdirde, işaretçi olayını hemen gönderin.
OnClockRestart Duraklatılırken kuyruğa alınan tüm örnekleri işleyin ve ardından OnClockStartile aynı şekilde davranın. Kuyruğa alınan işaretçiler için MEStreamSinkMarker olayları gönderin (örnek işleme ile serileştirilmiş) ve ardından OnClockStartile aynı şekilde davranın.
OnClockStop Kuyruğa alınan tüm örnekleri bırakın. ProcessSample diğer çağrılar başarısız olabilir. Kuyruğa alınmış işaretçi olaylarını gönderme. PlaceMarker'a yapılan sonraki çağrılarda işaretçi olayını hemen gönderin.

 

Ayrıca, durum geçişlerini tamamlayan akış havuzlarının aşağıdaki olayları göndermesi gerekir:

Sonlandırılıyor

Bazı medya havuzları, son örnek teslim edildikten sonra ek bir işlem adımı gerektirir. Bu gereksinim genellikle dosyaya üst bilgi veya dizin yazması gereken arşiv havuzları için geçerlidir. Bir medya havuzu son işleme gerektiriyorsa, IMFFinalizableMediaSink arabirimini kullanıma sunar.

İstemci son örneği teslim ettikten sonra, istemci bu arabirim için sorgular. Medya havuzu arabirimi destekliyorsa istemci, son işlemeyi zaman uyumsuz olarak gerçekleştirmek için IMFFinalizableMediaSink::BeginFinalize çağırır. Bu yöntem, Zaman Uyumsuz Geri Çağırma Yöntemleri'nde açıklanan standart Media Foundation zaman uyumsuz modelini izler. Medya havuzu, istemcinin BeginFinalizeçağıracağını varsayabilir. BeginFinalize çağrılamaması yanlış yazılmış bir dosyaya neden olabilir.

Kapatma

İstemci medya havuzu kullanılarak tamamlandığında, istemci IMFMediaSink::Shutdownçağırır. Bu yöntemin içinde, ortam havuzu döngüsel başvuru sayılarını kesmelidir. Genellikle, medya havuzu ile akış havuzları arasında döngüsel başvurular olacaktır.

olay kuyruğu yardımcı nesnesini kullanarak IMFMediaEventGeneratoruyguluyorsanız, olay kuyruğunda IMFMediaEventQueue::Shutdown çağrısı yapın. Bu yöntem olay kuyruğunun kapatılmasını sağlar ve şu anda bir olay bekleyen çağıranlara sinyal gönderir.

Kapatıldıktan sonra, IUnknown yöntemleri dışında, medya havuzundaki tüm yöntemler MF_E_SHUTDOWN döndürür.

Medya Havuzu Arabirimleri

Aşağıdaki tabloda, medya havuzlarının QueryInterfacearacılığıyla kullanıma sununabileceği standart arabirimler listelenmiştir. Medya havuzları özel arabirimleri de kullanıma açabilir.

Arayüz Açıklama
IMFMediaSink Medya havuzları için birincil arabirim. (Gerekli.)
IMFClockStateSink Sunu saatinin durumu değiştiğinde medya havuzuna bildirim göndermek için kullanılır. (Gerekli.)
IMFFinalizableMediaSink Medya havuzu son bir işlem adımı gerçekleştirmesi gerekiyorsa uygulayın. (İsteğe bağlı.)
IMFGetService Medya havuzu herhangi bir hizmet arabirimini kullanıma sunarsa uygulayın. (İsteğe bağlı.)
IMFMediaEventGenerator Medya havuzu herhangi bir olay gönderirse uygulayın. (İsteğe bağlı.)
IMFMediaSinkPreroll Medya havuzu ön kaydı destekliyorsa uygulayın. (İsteğe bağlı.)
IMFPresentationTimeSource Medya havuzu sunu saati için bir zaman kaynağı sağlayabilecekse uygulayın. (İsteğe bağlı.)
IMFQualityAdvise Medya havuzu kayıttan yürütme kalitesini ayarlayıp ayarlayamıyorsa uygulayın. (İsteğe bağlı.)

 

İsteğe bağlı olarak, bir medya havuzu hizmet olarak aşağıdaki arabirimi uygulayabilir.

Hizmet arabirimi Açıklama
IMFRateSupport Desteklenen kayıttan yürütme hızları aralığını raporlar.

 

Hizmet arabirimleri ve IMFGetServicehakkında daha fazla bilgi için bkz. Hizmet Arabirimleri.

Akış Havuzu Arabirimleri

Akış havuzları, QueryInterfacearacılığıyla aşağıdaki arabirimleri kullanıma sunmalıdır.

Arayüz Açıklama
IMFStreamSink Akış havuzları için birincil arabirim. (Gerekli.)
IMFMediaEventGenerator Olayları kuyruğa alır. IMFStreamSink arabirimi bu arabirimi devralır. (Gerekli.)

 

Şu anda akış havuzları için hiçbir hizmet arabirimi tanımlanmamıştır.

Akış Havuzu Olayları

Aşağıdaki tabloda, genel akış havuzları için tanımlanan olaylar listelenir. Akış havuzları burada listelenmeyen özel olayları da gönderebilir.

Olay Açıklama
MEStreamSinkFormatChanged Akış havuzu ortam türü artık geçerli değil. (İsteğe bağlı.)
MEStreamSinkMarker İşaretçi işlendi. (Gerekli.)
MEStreamSinkPaused Akış havuzu duraklatıldı. (Gerekli.)
MEStreamSinkPrerolled Ön kayıt tamamlandı. (İsteğe bağlı.)
MEStreamSinkRateChanged Akış havuzu kayıttan yürütme hızını değiştirdi. (İsteğe bağlı.)
MEStreamSinkRequestSample Yeni bir örnek istendi. (Gerekli.)
MEStreamSinkScrubSampleComplete Temizleme isteği tamamlandı. (İsteğe bağlı.)
MEStreamSinkStarted Akış havuzu başlatıldı. (Gerekli.)
MEStreamSinkStopped Akış havuzu durduruldu. (Gerekli.)

 

Şu anda medya havuzları için genel amaçlı olaylar tanımlanmamıştır. Bazı medya havuzları özel olaylar gönderebilir.

media foundation pipeline

Media Foundation Mimarisi