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.
ASF çoklayıcı, ASF Veri Nesnesi ile çalışan ve uygulamaya ContentInfo nesnesinde tanımlanan gereksinimlerle eşleşen bir akış için ASF veri paketleri oluşturma olanağı sağlayan bir WMContainer katmanı bileşenidir.
Çoğullayıcının bir girişi ve bir çıkışı vardır. Dijital medya verilerini içeren bir akış örneği alır ve ASF kapsayıcısına yazılabilir bir veya daha fazla veri paketi üretir.
Aşağıdaki listede ASF veri paketleri oluşturma işlemi özetlenmiştir:
- giriş verilerini IMFASFMultiplexer::P rocessSampleiçindeki çoğullayıcıya geçirin.
- Tüm paketler alınana kadar bir döngüde IMFASFMultiplexer::GetNextPacket çağırarak veri paketlerini toplayın.
- Giriş verileri tam paketlere dönüştürüldükten sonra, çoğullayıcıda GetNextPackettarafından alınmayan bazı bekleyen veriler olabilir. Bekleyen örnekleri paketlemek ve bunları çoğullayıcıdan toplamak için IMFASFMultiplexer::Flush çağırın, ardından GetNextPacket yeniden çağırın.
- veri paketi oluşturma sırasında çoğullayıcı tarafından yapılan değişiklikleri yansıtacak şekilde IMFASFMultiplexer::End çağırarak ilişkili ASF Üst Bilgi Nesnelerini güncelleştirin.
Aşağıdaki diyagramda, bir ASF dosyası için çoklayıcı aracılığıyla veri paketi oluşturma gösterilmektedir.
Asf dosyasıdiyagramı
ASF Veri Paketi Oluşturma
Multiplexer Nesnesi Oluşturma açıklandığı gibi çoklayıcıyı oluşturup başlatdıktan sonra, veri paketlerine işlenmek üzere giriş verilerini çoğullayıcıya geçirmek üzere IMFASFMultiplexer::P rocessSample çağırın. Belirtilen giriş, bir akış verilerini içeren bir veya daha fazla medya arabelleğine (IMFMediaBuffer arabirimi) sahip olabilecek bir medya örneğinde (IMFSample arabirimi) olmalıdır. ASF'den ASF'ye dönüştürme durumunda, giriş medya örneği, paketlenmiş akış örnekleri oluşturan bir ayırıcıdan oluşturulabilir. Daha fazla bilgi için bkz. ASF Bölücü.
ProcessSampleçağırmadan önce, giriş medyası örneğinin zaman damgasının geçerli bir sunu zamanı olduğundan emin olun; aksi takdirde ProcessSample başarısız olur ve MF_E_NO_SAMPLE_TIMESTAMP kodunu döndürür.
Çoğullayıcı, ProcessSamplearacılığıyla girişi sıkıştırılmış veya sıkıştırılmamış medya örnekleri olarak kabul edebilir. Çoğullayıcı, akışın bant genişliği kullanımına bağlı olarak bu örneklere gönderme süreleri atar. Bu işlem sırasında, çoğullayıcı sızdıran demet parametrelerini (bit hızı ve arabellek penceresi kullanımı) denetler ve bu değerlere uymayan örnekleri reddedebilir. Giriş medyası örneği, aşağıdaki nedenlerden biri nedeniyle bant genişliği denetiminde başarısız olabilir:
- Son atanan gönderme süresi bu medya örneğindeki zaman damgasından büyük olduğundan giriş medya örneği geç geldiyse. ProcessSample başarısız olur ve MF_E_LATE_SAMPLE hata kodunu döndürür.
- Giriş medyası örneğinin zaman damgası, atanan gönderme zamanından daha önceyse (bu durum arabellek taşmasını gösterir). Çoklayıcı, başlangıçta MFASF_MULTIPLEXER_AUTOADJUST_BITRATE bayrağını ayarlayarak bit hızını ayarlayacak şekilde yapılandırılırsa, bu durumu yoksayabilir. Daha fazla bilgi için, Multiplexer Nesnesi Oluşturma'deki "Çoklayıcı Başlatma ve SızıntıLı Demet Ayarları" bölümüne bakın. Bu bayrak ayarlanmazsa ve çoğullayıcı bant genişliği taşmasıyla karşılaşırsa ProcessSample başarısız olur ve MF_E_BANDWIDTH_OVERRUN hata kodunu döndürür.
Çoğullayıcı gönderme süresini atadıktan sonra, giriş medyası örneği gönderme penceresine eklenir( gönderme zamanlarına göre sıralanmış ve veri paketlerinde işlenmeye hazır giriş medya örneklerinin listesi). Veri paketi oluşturma sırasında giriş medyası örneği ayrıştırılır ve ilgili veriler veri paketine yük olarak yazılır. Eksiksiz bir veri paketi, bir veya daha fazla giriş medyası örneğinden veri içerebilir.
Gönderme penceresine yeni giriş medya örnekleri geldiğinde, eksiksiz bir paket oluşturmak için yeterli medya örneği olana kadar kuyruğa eklenirler. Giriş medya örneği tarafından kapsanan medya arabelleklerindeki veriler oluşturulan veri paketine kopyalanmaz. Veri paketi, giriş medyası örneği tam paket haline getirilene ve paketin tamamı çoğullayıcıdan toplanana kadar giriş medyası arabelleklerine başvurular tutar.
Tam bir veri paketi mevcut olduğunda, IMFASFMultiplexer::GetNextPacketçağrılarak alınabilir. Alınması için hazır olan eksiksiz paketler varken ProcessSample çağırırsanız, işlem başarısız olur ve MF_E_NOTACCEPTING hata kodunu döndürür. Bu, çoğullayıcının daha fazla giriş kabul edemeyeceğini ve bekleyen paketleri almak için getNextPacket çağırmanız gerektiğini gösterir. İdeal olarak, her ProcessSample çağrısının ardından, veri paketlerinin tamamını almak için bir veya daha fazla GetNextPacket çağrısı gerekir. Eksiksiz bir veri paketi oluşturmak için birden fazla giriş medya örneği gerekebilir. Buna karşılık, bir giriş medyası örneğindeki veriler birden çok pakete yayılabilir. Bu nedenle, ProcessSample çağrılarının tümü çıkış medyası örnekleri vermez.
Giriş medyası örneği MFSampleExtension_CleanPoint özniteliği tarafından belirtilen bir anahtar çerçeve içeriyorsa, çoğullayıcı özniteliği pakete kopyalar.
ASF Veri Paketlerini Alma
Çoklayıcı tarafından oluşturulan eksiksiz bir veri paketi için çıkış medyası örneklerini toplamak için, paket için daha fazla çıktı medya örneği kalmayıncaya kadar bir döngüde IMFASFMultiplexer::GetNextPacket çağırın. Başarı durumlarını aşağıda listelemktir:
- Kullanılabilir eksiksiz bir veri paketi varsa, GetNextPacketpdwStatusFlags parametresinde ASF_STATUS_FLAGS_INCOMPLETE bayrağını alır; ppIPacket parametresi, ilk veri paketine yönelik bir işaretçi alır. Bu bayrağı aldığı sürece bu yöntemi çağırmanız gerekir. Her yinelemede ppIPacket kuyruktaki bir sonraki paketi işaret eder.
- Yalnızca bir veri paketi varsa, ppIPacket ona işaret eder ve pdwStatusFlagsiçinde ASF_STATUS_FLAGS_INCOMPLETE bayrağı alınmaz.
- GetNextPacket, çoğullayıcı hala veri paketlerini paketleme ve ekleme sürecindeyse herhangi bir veri paketi sunmasa bile başarılı olabilir. Bu durumda ppIPacketNULLişaret eder. Devam etmek için, ProcessSampleçağırarak çoklayıcıya daha fazla giriş medyası örneği sağlamanız gerekir.
Aşağıdaki örnek kod, çoklayıcıyı kullanarak veri paketleri oluşturan bir işlevi gösterir. Oluşturulan veri paketi içeriği, çağıran tarafından ayrılan veri bayt akışına yazılır.
//-------------------------------------------------------------------
// GenerateASFDataPackets
//
// Gets data packets from the mux. This function is called after
// calling IMFASFMultiplexer::ProcessSample.
//-------------------------------------------------------------------
HRESULT GenerateASFDataPackets(
IMFASFMultiplexer *pMux,
IMFByteStream *pDataStream
)
{
HRESULT hr = S_OK;
IMFSample *pOutputSample = NULL;
IMFMediaBuffer *pDataPacketBuffer = NULL;
DWORD dwMuxStatus = ASF_STATUSFLAGS_INCOMPLETE;
while (dwMuxStatus & ASF_STATUSFLAGS_INCOMPLETE)
{
hr = pMux->GetNextPacket(&dwMuxStatus, &pOutputSample);
if (FAILED(hr))
{
break;
}
if (pOutputSample)
{
//Convert to contiguous buffer
hr = pOutputSample->ConvertToContiguousBuffer(&pDataPacketBuffer);
if (FAILED(hr))
{
break;
}
//Write buffer to byte stream
hr = WriteBufferToByteStream(pDataStream, pDataPacketBuffer, NULL);
if (FAILED(hr))
{
break;
}
}
SafeRelease(&pDataPacketBuffer);
SafeRelease(&pOutputSample);
}
SafeRelease(&pOutputSample);
SafeRelease(&pDataPacketBuffer);
return hr;
}
WriteBufferToByteStream işlevi, IMFByteStream::Writekonusunda gösterilir.
Bu kod örneğini kullanan eksiksiz bir uygulamayı görmek için bkz. Eğitim: ASF akışlarını bir dosyadan diğerine kopyalama.
Packet-Generation Aramaları Gönderme
Çoklayıcıda bekleyen tam veri paketi olmadığından emin olmak için IMFASFMultiplexer::Flushçağrısı yapın. Bu, çoğullayıcıyı işlemdeki tüm medya örneklerini paketlemeye zorlar. Uygulama, alınabilecek başka paket kalmayıncaya kadar bu paketleri bir döngüde GetNextPacket aracılığıyla medya örnekleri biçiminde toplayabilir.
Tüm medya örnekleri oluşturulduktan sonra, bu veri paketleriyle ilişkili ASF Üst Bilgi Nesnesini güncelleştirmek için IMFASFMultiplexer::End çağrısı yapın. Üst Bilgi Nesnesi, çoğullayıcıyı başlatmak için kullanılan ContentInfo nesnesi geçirilerek belirtilir. Bu çağrı, veri paketi oluşturma sırasında çoğullayıcı tarafından yapılan değişiklikleri yansıtacak şekilde çeşitli Üst Bilgi Nesnelerini güncelleştirir. Bu bilgiler paket sayısını, gönderme süresini, yürütme süresini ve tüm akışların akış numaralarını içerir. Genel üst bilgi boyutu da güncelleştirilir.
Tüm veri paketleri alındıktan sonra Bitiş çağrıldığından emin olmanız gerekir. Çoğullayıcıda bekleyen paket varsa End başarısız olur ve MF_E_FLUSH_NEEDED hata kodunu döndürür. Bu durumda, döngüde Flush ve GetNextPacket çağırarak bekleme paketini alabilirsiniz.
Not veya Uyarı (depending on context)
VBR kodlaması için, Endçağrısı yaptıktan sonra ContentInfo nesnesinin kodlama özelliklerinde kodlama istatistiklerini ayarlamanız gerekir. Bu işlem hakkında daha fazla bilgi için, "ContentInfo Nesnesi'nde Özellikleri Ayarlama" bölümündeki "ContentInfo Nesnesini Kodlayıcı Ayarlarıyla Yapılandırma" konusuna bakın. Aşağıdaki liste, ayarlanacağı belirli özellikleri gösterir:
- MFPKEY_RAVG, VBR içeriğinin ortalama bit hızıdır.
- MFPKEY_BAVG, ortalama bit hızının tampon penceresidir.
- MFPKEY_RMAX, VBR içeriğinin en yüksek bit hızıdır.
- MFPKEY_BMAX en yüksek arabellek penceresidir.
İlgili konular
-
Öğreticisi: CBR Kodlama Kullanarak WMA Dosyası Yazma