Hız Kontrolü Uygulaması
Bu konu, özel boru hattı nesnelerinin ters oynatma dahil olmak üzere değişken oynatma hızlarını nasıl desteklediği açıklanıyor. Bir uygulamadan hız denetimi kullanma hakkında bilgi için bkz. Hız Denetimi.
Bu konu aşağıdaki bölümleri içerir:
Microsoft Media Foundation işlem hattı nesnesi (medya kaynağı, dönüşüm veya medya havuzu) yazıyorsanız, değişken kayıttan yürütme hızlarını desteklemeniz gerekebilir. Bunu yapmak için aşağıdaki arabirimleri uygulayın:
- IMFGetService arabirimini uygulayın.
- MF_RATE_CONTROL_SERVICE hizmetini destekleyin. (Bkz. Hizmet Arabirimleri.)
- Nesne tarafından desteklenen kayıttan yürütme hızlarını almak için IMFRateSupport arabirimini uygulayın.
- Oynatma hızını alan veya ayarlayan IMFRateControl arabirimini uygulayın.
Medya Kaynakları
Medya kaynağı hız denetimini destekliyorsa hem IMFRateSupport hem de IMFRateControluygulamalıdır. Aksi takdirde, Medya Oturumu işlem hattındaki diğer bileşenlerden bağımsız olarak en düşük ve en yüksek kayıttan yürütme hızının 1,0 olduğunu bildirir.
Kayıttan yürütme hızı, örneklerin sunum zamanlarını etkilemez, bu nedenle medya kaynağının zaman damgalarını ayarlamaması gerekir. Bunun yerine, sunu saati daha hızlı veya daha yavaş bir hızda çalışır. Geri oynatma sırasında, kaynak örnekleri zaman damgaları azalan sırayla sunulur.
IMFRateControl::SetRate yönteminin fThin parametresi, medya kaynağının içerik ince olup olmayacağını gösterir. İnceltme öncelikli olarak video akışları için geçerlidir. İnceltilmiş modda, kaynak delta çerçeveleri bırakır ve yalnızca anahtar çerçeveler sunar. Çok yüksek kayıttan yürütme hızlarında, kaynak bazı anahtar çerçeveleri atlayabilir (örneğin, diğer tüm anahtar çerçeveleri teslim edebilir).
Kaynağın ses örneklerini seyreltilmiş modda bırakması gerekmez. Ancak, kayıttan yürütme hızları çok yüksek olduğunda, kaynak işlem hattının örnek isteklerini doldurmak için yeterince hızlı veri okuyamayabilir. Bu durumda, kaynağın bazı ses verilerini silmesi gerekebilir. Öyleyse, video örneklerine zamanında yakın ses örnekleri göndermeyi denemelidir (kaynağın her iki akış türüne de sahip olduğu varsayılır).
Bir akış inceltilmiş moddan inceltilmemiş moda geçiş yaparken MEStreamThinMode olayını gönderir.
Medya kaynağı SetRateçağrısını tamamladığında, MESourceRateChanged olayını gönderir.
Geri kayıttan yürütme sırasında:
- Medya kaynağı, zaman damgalarını ayarlamadan örnekleri ters sırada teslim eder.
- Akış içindeki zaman damgaları monoton olarak azalmalıdır.
- İçeriğin başlangıcı akışın sonu olarak kabul edilir. Her medya akışı akıştaki ilk örneği (sunu zamanı = 0) teslim ettikten sonra MEEndOfStream olayını gönderir.
Media Foundation Dönüşümleri
Genel olarak, Media Foundation dönüşümü (MFT), inceltilmemiş ters oynatma uygulamadığı sürece, hız denetimi için doğrudan desteğe ihtiyaç duymaz.
MFT, IMFRateSupport arabirimini uygulamazsa, Medya Oturumu aşağıdakileri varsayar:
- MFT, hem inceltilmiş hem de inceltilmemiş ilerleyen oynatma için rastgele oynatma hızlarını destekler.
- MFT, inceltilmiş ters oynatımı destekler, ancak inceltilmemiş ters oynatımı desteklemez.
Bu koşullardan biri doğru değilse, MFT IMFRateSupport ve IMFRateControluygulamalıdır.
Ters Yönde Oynatma
İşlem hattındaki bir veya daha fazla dönüşüm açıkça ters kayıttan yürütmeyi desteklemese bile Medya Oturumu ters olarak yürütülebilir.
MFT, IMFRateSupport arabirimini ortaya çıkarmazsa, Medya Oturumu geriye doğru oynatma için aşağıdaki gibi inceltme kullanılır.
IMFTransform::ProcessInputçağrısı yapılarak, Medya Oturumu, her zamanki şekilde MFT'ye ana kareler gönderir.
Medya Oturumu, delta çerçevelerini kaldırır ve bunların yerine MEStreamTick olayları ile değiştirir.
Her örnek arasında Medya Oturumu, zaman damgalarının azalmasından kaynaklanan hataları önlemek için MFT'yi temizler.
MFSampleExtension_CleanPoint özniteliği TRUE olarak ayarlanmışsa örnek anahtar çerçeve olarak kabul edilir ve bu öznitelik FALSE ise veya ayarlanmadıysa bir delta çerçevesi olarak kabul edilir.
MFT, IMFRateSupportuygularsa, Medya Oturumu, MFT'nin eksiltme yapılmamış geri oynatmayı destekleyip desteklemediğini keşfetmek için bu arabirimi kullanır. MFT inceltilmemiş ters oynatmayı destekliyorsa, Medya Oturumu örnekleri düşürmeden veya MFT'yi boşaltmadan tüm örnekleri ters sırayla sağlar.
MFT ince olmayan ters kayıttan yürütmeyi destekliyorsa, IMFRateControl arabirimini uygulamalıdır. Medya Oturumu, geri oynatma gerçekleştiğinde MFT'yi bildirmek için bu arabirimi kullanır. Bu noktada, MFT zaman damgalarının değerlerinin azalmasına ve delta çerçevelerinin ters sırada gelmesine hazırlıklı olmalıdır. Kod çözücü genellikle bir resim grubunun tamamını (GOP) alana kadar örnekleri arabelleğe almalı, ardından GOP'un tamamının kodunu çözerek kodu çözülen kareleri doğru (ters) sırada çıkaracaktır.
Medya Havuzları
Medya alıcısı hızsızise, Medya Oturumu, medya alıcısının her türlü oynatma hızını işleyebileceğini varsayar. Medya alıcısı, IMFRateSupportuygulamak zorunda değildir. (Oransız medya havuzu, IMFMediaSink::GetCharacteristics metodundan MEDIASINK_RATELESS bayrağını döndürür.)
Aksi takdirde, medya çukuru 1,0 dışındaki çalma hızlarını işleyebilirse IMFRateSupport desteklemelidir.
Medya havuzları, IMFRateControluygulamamalıdır. Kayıttan yürütme hızı değiştiğinde, sunu saati medya sonlandırıcısının IMFClockStateSink::OnClockSetRate yöntemini çağırır.
İlgili konular