DirectShow'da Pencere Medya codec'lerini kullanma

Windows Media Ses ve Video kodlayıcı ve kod çözücü nesneleri aslen ASF dosya kapsayıcı biçimi ve Windows Media Format SDK'sı ile çalışacak şekilde tasarlanmış ve iyileştirilmiştir. Codec nesneleri DirectShow'da belirli senaryolar için (tek geçişli CBR ve video akışlarının kalite tabanlı VBR kodlaması) iyi çalışır. Ancak ASF dışındaki dosya kapsayıcılarını kullanarak codec nesnelerini doğrudan DirectShow'da kullanmayı düşünüyorsanız önceden bilmeniz gereken bazı davranışlar ve sorunlar vardır.

Not

DirectShow ile tek başına codec bileşenleri kullanacaksanız, muhtemelen bunları yalnızca DMO olarak kullanmak istersiniz. Başka bir deyişle, IMFTransformyerine IMediaObject arabirimini kullanacaksınız.

 

AVI Dosyalarında WM Ses

WMA akışlarını, çoklayıcı filtreniz olan herhangi bir dosya kapsayıcı biçiminde kodlamak için DirectShow'u kullanabilirsiniz. Ancak Windows Media Ses ve Video codec arabirimleri, WMA akışına sahip bir AVI dosyasında ses-video eşitlemesini korumak için varsayılan DirectShow AVI kayıttan yürütme filtrelerini kullanarak mümkün olmadığından AVI dosyalarında WMA'yı desteklemez. Daha fazla bilgi için bkz. Sıkıştırılmış Medyayı AVI Dosyalarında Depolama.

Ses kodlayıcısı DMO, "sabit bit hızı" modunda bile değişen süre örnekleri üretir. Bu nedenle, zaman damgalarını kullanan dosya kapsayıcı biçimleriyle en iyi şekilde çalışır. AVI dosyaları her ses örneği veya örnek grubu için bir zaman damgası sağlamaz. DirectShow'da AVI Bölücü filtresi, AVI akış üst bilgisindeki WAVEFORMATEX yapısındaki nAvgBytesPerSec değeri temelinde her örnek grubu (her ses çerçevesi) için zaman damgaları üretir.

Bu hesaplamanın temelindeki varsayım, akıştaki tüm ses örneklerinin eşit süreye sahip olduğudur; ancak, DMO tarafından alınan örneklerin çıkışı eşit süreye sahip değildir ve bu nedenle AVI Bölücü tarafından uygulanan zaman damgaları doğru değildir. Bu nedenle, AVI Splitter'ı veya ses kod çözücü DMO'sunu değiştirmeden, ses ve video akışları eşitlenmiş AVI dosyalarını oynatmak için DirectShow tabanlı herhangi bir uygulamayı kullanmak mümkün değildir. Windows Media Audio 9 Voice codec bileşeni bazı durumlarda çalışır, ancak bu bile herhangi bir arama işleminden sonra eşitlemeyi kaybeder, bu nedenle gerçekten uygun bir çözüm olarak kabul edilemez.

MP3 kodlayıcınız varsa, ses akışı için WMV ve MP3 ile AVI dosyaları oluşturabilirsiniz. Windows Media Player ve diğer DirectShow tabanlı uygulamalarda bu tür dosyalar doğru şekilde yürütülür ve aranır çünkü AVI Splitter, MP3 akışları için özel işleme kodu içerir. Başka bir seçenek sıkıştırılmamış PCM ses kullanmaktır, ancak sonuçta elde edilen dosya boyutu sıkıştırılmış ses akışından çok daha büyük olacaktır. DirectShow örnek uygulaması AVI dosyaları oluşturduğundan, ses kodlayıcı DMO'sunun nasıl kullanılacağını göstermez.

Tek geçişli Kodlama

Video kodlayıcı DMO, iki kodlama modu için DirectShow'da kolayca çalışır: CBR ve kalite tabanlı VBR. Örnek uygulamada gösterildiği gibi, filtre grafiğini oluştururken doğru işlem sırasını izlediğiniz sürece, AVI Multiplexer ve Dosya Yazıcı kullanarak WMV içeriğini bir AVI dosyasına yerleştirmek nispeten basittir.

İki Geçişli Kodlama

İki geçişli kodlama modları, DMO'un ikinci geçişe başlamadan önce içeriğini ilk geçişten boşaltmasını önlemek için graf oluşturma ve akış için daha karmaşık bir yaklaşım gerektirir. İki geçişli kodlamada, DMO'nun dosya verileri üzerinde önişlem analizini yapabilmesi için grafiği bir kez çalıştırmak ve ardından grafiği geri sarmak ve DMO'nun gerçek kodlamayı yapabilmesi için yeniden çalıştırmak gerekir.

Grafik ikinci geçiş için çalışma durumuna geçtiğinde, DMO Sarmalayıcı, ilk örnekte SÜREKSİZLİK bayrağını ayarlar, çünkü zaman damgası, ilk geçişteki son zaman damgasıyla sıralı değildir. DirectShow'da bu şekilde çalışacak şekilde tasarlanmamış olan DMO, SÜREKSİ SONA ERİYOR bayrağını aldığında, temizleme işlemi gerçekleştirir ve ilk geçişte depolanan verileri kaybeder. Bu sorunu çözmek için, en iyi çözüm büyük olasılıkla grafik ilk geçişten sonra arandığında SÜREKSİZLİK bayrağını ayarlamayan özel bir DMO Sarmalayıcı filtresi yazmaktır. Bu SDK'daki Windows için Video (VfW) örneği, iki geçişli kodlamanın nasıl gerçekleştirileceklerini gösterir.

Araya Alınan İçerik

WMV kodlayıcı DMO, aralama işlemini koruyarak aralıklı içeriği kodlayabilir. Bu, TV'den yakalanan ve TV'de oynatılabilen içerikler için kullanışlıdır. Ancak, varsayılan DMO Sarmalayıcısı kullanılarak ara sarmalamanın korunması mümkün değildir, çünkü bu filtre giriş örneklerinde INSSBuffer desteklemez.

DMO, aldığı her örnek için ara ayarları almak için bu arabirimi kullanır. DMO Sarmalayıcı'da olduğu gibi arabirim bulunamazsa, DMO yalnızca giriş örneklerini noninterlaced olarak değerlendirir. DirectShow'da geçişli kodlama gerçekleştirmek için çeşitli alternatifler vardır. En kolay yaklaşım büyük olasılıkla Windows Media Format 9 Series SDK'sını doğrudan veya WM ASF Yazıcı DirectShow filtresini kullanarak birlikte oluşturulmuş bir ASF dosyası oluşturmaktır. Daha sonra bu dosyayı başka bir biçimde kodlayabilirsiniz. AVI'ye kod çevirirseniz, ara dosyanız olur, ancak standart DirectShow AVI kayıttan yürütme filtreleri VIDEOINFOHEADER2desteklemedikleri için bunu tanımaz. Bir diğer yaklaşım da INSSBuffer arabirimini destekleyen kendi DMO Sarmalayıcı filtrenizi yazmaktır.

Codec DMO'larıyla çalışma