Aracılığıyla paylaş


Örnek Yazmak için

[Windows Media Format 11 SDK bu sayfayla ilişkilendirilmiş özellik eski bir özelliktir. Kaynak Okuyucu ve Havuz Yazıcısıtarafından değiştirildi. Kaynak Okuyucu ve Havuz Yazıcısı Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, yeni kodun mümkün olduğunda Kaynak Okuyucu ve Alım Yazıcı yerine Windows Media Format 11 SDKkullanmasını şiddetle tavsiye eder. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]

Yazmakta olduğunuz dosyanın girişlerini tanımlayıp yapılandırdığınızda, örnekleri yazıcıya geçirmeye başlayabilirsiniz. Yazma işlemini daha verimli hale getirmek için, mümkünse örnekleri sunum zamanına göre geçirmelisiniz.

Herhangi bir örneği geçirmeden önce, IWMWriter::BeginWritingçağırarak yazıcıyı bunları kabul etmek üzere ayarlamanız gerekir.

Bir örneği yazara iletmek için aşağıdaki adımları uygulayın:

  1. IWMWriter::AllocateSampleçağrısı yaparak bir arabellek ayırın ve INSSBuffer arabirimine bir işaretçi alın.
  2. INSSBuffer::GetBufferçağırarak 1. adımda oluşturulan arabelleğin adresini alın.
  3. Geçirilen örneğin ayrılan arabelleğe sığmasını sağlayarak örnek verilerinizi arabellek konumuna kopyalayın. Verilerinizi kopyalamak için herhangi bir bellek kopyalama işlevini kullanabilirsiniz. Yaygın bir seçenek, standart C çalışma zamanı kitaplığına dahil edilen memcpy'dir.
  4. INSSBuffer::SetLengthçağrısı yaparak, arabellekte kullanılan veri miktarını örneğin gerçek boyutunu yansıtması için güncelleştirin.
  5. IWMWriter::WriteSample komutunu kullanarak giriş numarası ve örnek zamanıyla birlikte arabellek arabirimini yazıcıya aktarın. Bir girişin tüm ses örnekleri aynı içerik süresini temsil eder, bu yüzden örnek süresini, birikerek devam eden toplam süreye ekleyerek hesaplayabilirsiniz. Video için süreyi kare hızına göre hesaplamanız gerekir.

WriteSample zaman uyumsuz olarak çalışır ve uygulamanız yöntemi yeniden çağırmaya hazır olmadan önce arabellekten veri yazmayı bitiremeyebilir. Bu nedenle, her WriteSampleçağrısı için AllocateSample bir kez çağırmak önemlidir. Ancak, INSSBuffer arabirimini WriteSampleçağrıldıktan hemen sonra serbest bırakabilirsiniz.

Örnekleri geçirmeyi bitirdiğinizde, IWMWriter::EndWritingöğesini çağırabilirsiniz.

Not Dosyadaki tüm akışlardan alınan örneklerin birbiriyle eşzamanlı olarak yazara iletilmesi önemlidir. \nYani, mümkün olduğunda, IWMWriterAdvanced::SetSyncToleranceiçinde belirtilen eşitleme toleransı dahilinde sunum zaman sırasına göre yazara örnekler geçirmeniz gerekir. En iyi sonuçlar, veriler her akışa bir saniye veya daha az birim halinde teslim edildiğinde elde edilir.

Akışlar da yaklaşık olarak aynı zamanda bitmelidir. Örneğin, 45 saniye uzunluğunda bir ses akışı ve 50 saniye uzunluğunda bir video akışı içeren bir dosya yazmamalısınız. Böyle bir dosyayı değiştirilmemiş girişlerle kodlarsanız, ses akışının sonundaki bazı ses verileri atılır (daha kısa ses akışı olsa bile). Dosya kodlamanın çalışmasını sağlamak için ses girişine 5 saniyelik sessizlik eklemeniz gerekir, böylece bir akış diğerinin birkaç saniye önce bitmesin. Metin veya görüntü akışları gibi aralıklı örnekler içeren akış türlerinin bu şekilde doldurulması gerekmez. Betik komut akışları da tüm bu kurallara uymalıdır.

INSSBuffer Arabirimi

IWMWriter Arabirimi

ASF Dosyaları yazma