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.
sunu, ortak bir sunu zamanını paylaşan ilgili medya akışları kümesidir. Örneğin, sunu bir filmdeki ses ve video akışlarından oluşabilir. sunu tanımlayıcısı, belirli bir sununun açıklamasını içeren bir nesnedir. Sunu tanımlayıcıları, medya kaynaklarını ve bazı medya havuzlarını yapılandırmak için kullanılır.
Her sunu tanımlayıcısı, bir veya daha fazlaakış tanımlayıcısının listesini içerir. Bunlar, sunudaki akışları açıklar. Akışlar seçilebilir veya seçimi kaldırılabilir. Yalnızca seçili akışlar veri üretir. Seçili olmayan akışlar etkin değildir ve veri üretmez. Her akış tanımlayıcısının, akışın medya türünü değiştirmek veya akışın geçerli medya türünü almak için kullanılan birmedya türü işleyicisi vardır. (Medya türleri hakkında daha fazla bilgi için bkz. Medya Türleri.)
Aşağıdaki tabloda, bu nesnelerin her birinin kullanıma sunduğu birincil arabirimler gösterilmektedir.
| Nesne | Arayüz |
|---|---|
| Sunu tanımlayıcısı | IMFPresentationDescriptor |
| Akış tanımlayıcısı | IMFStreamDescriptor |
| Medya türü işleyicisi | IMFMediaTypeHandler |
Medya Kaynağı Sunuları
Her medya kaynağı, kaynak için varsayılan yapılandırmayı açıklayan bir sunu tanımlayıcısı sağlar. Varsayılan yapılandırmada en az bir akış seçilir ve seçilen her akışın bir medya türü vardır. Sunu tanımlayıcısını almak için IMFMediaSource::CreatePresentationDescriptorçağrısı yapın. yöntemi bir IMFPresentationDescriptor işaretçisi döndürür.
Farklı bir akış kümesi seçmek için kaynağın sunu tanımlayıcısını değiştirebilirsiniz. Medya kaynağı durdurulmadığı sürece sunu tanımlayıcısını değiştirmeyin. Kaynak başlatmak için IMFMediaSource::Start çağrısı yaptığınızda değişiklikler uygulanır.
Akış sayısını almak için IMFPresentationDescriptor::GetStreamDescriptorCountçağrısında bulunur. Bir akışın akış tanımlayıcısını almak için IMFPresentationDescriptor::GetStreamDescriptorByIndex çağırın ve akışın dizinini geçirin. Akışlar sıfırdan dizine eklenir. GetStreamDescriptorByIndex yöntemi bir IMFStreamDescriptor işaretçisi döndürür. Ayrıca akışın seçili olup olmadığını gösteren bir Boole bayrağı döndürür. Akış seçilirse, medya kaynağı bu akış için veri üretir. Aksi takdirde, kaynak bu akış için herhangi bir veri üretmez. Akış seçmek için, akışın diziniyle IMFPresentationDescriptor::SelectStream çağrısı yapın. Bir akışın seçimini kaldırmak için IMFPresentationDescriptor::D eselectStreamçağrısında bulunur.
Aşağıdaki kodda, bir medya kaynağından sunu tanımlayıcısının nasıl alınıp akışların numaralandırılabileceği gösterilmektedir.
HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL fSelected = FALSE;
IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;
hr = pSource->CreatePresentationDescriptor(&pPresentation);
if (SUCCEEDED(hr))
{
hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}
if (SUCCEEDED(hr))
{
for (DWORD iStream = 0; iStream < cStreams; iStream++)
{
hr = pPresentation->GetStreamDescriptorByIndex(
iStream, &fSelected, &pStreamDesc);
if (FAILED(hr))
{
break;
}
/* Use the stream descriptor. (Not shown.) */
SAFE_RELEASE(pStreamDesc);
}
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);
Medya Türü İşleyicileri
Akışın medya türünü değiştirmek veya akışın geçerli medya türünü almak için akış tanımlayıcısının medya türü işleyicisini kullanın. Medya türü işleyicisini almak için IMFStreamDescriptor::GetMediaTypeHandler çağırın. Bu yöntem bir IMFMediaTypeHandler işaretçisi döndürür.
Akışta ses veya video gibi ne tür veriler olduğunu öğrenmek istiyorsanız, IMFMediaTypeHandler::GetMajorTypeçağrısı yapın. Bu yöntem, ana medya türü için GUID döndürür. Örneğin, kayıttan yürütme uygulaması genellikle ses akışını ses işleyiciye, video akışını ise video işleyicisine bağlar. Topoloji oluşturmak için Medya Oturumu veya topoloji yükleyicisi kullanıyorsanız, ihtiyacınız olan tek biçim bilgisi ana tür GUID'i olabilir.
Uygulamanızın geçerli biçim hakkında daha ayrıntılı bilgilere ihtiyacı varsa, IMFMediaTypeHandler::GetCurrentMediaTypeçağrısı yapın. Bu yöntem, medya türünün IMFMediaType arabirimine bir işaretçi döndürür. Biçimin ayrıntılarını almak için bu arabirimi kullanın.
Medya türü işleyicisi, akış için desteklenen medya türlerinin listesini de içerir. Listenin boyutunu almak için, IMFMediaTypeHandler::GetMediaTypeCountöğesini çağırın. Listeden bir medya türü almak için, medya türü diziniyle IMFMediaTypeHandler::GetMediaTypeByIndex çağırın. Medya türleri yaklaşık tercih sırasına göre döndürülür. Örneğin, ses biçimleri için daha yüksek örnek hızları, daha düşük örnek hızları yerine tercih edilir. Ancak, sıralamayı yöneten kesin bir kural yoktur, bu nedenle bunu yalnızca bir kılavuz olarak değerlendirmelisiniz.
Desteklenen türlerin listesi, akışın desteklediği her olası medya türünü içermeyebilir. Belirli bir medya türünün desteklenip desteklenmediğini test etmek için, IMFMediaTypeHandler::IsMediaTypeSupportedçağırın. Medya türünü ayarlamak için IMFMediaTypeHandler::SetCurrentMediaTypeçağrısında bulunur. Yöntem başarılı olursa, akış belirtilen biçime uygun veriler içerir. SetCurrentMediaType yöntemi tercih edilen türlerin listesini değiştirmez.
Aşağıdaki kodda medya türü işleyicisinin nasıl alınıp tercih edilen medya türlerinin numaralandırılıp medya türü ayarlanacağı gösterilmektedir. Bu örnekte, uygulamanın medya türünü seçmek için burada gösterilmeyen bazı algoritmaları olduğu varsayılır. Ayrıntılar, uygulamanıza büyük ölçüde bağlıdır.
HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL bTypeOK = FALSE;
IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;
hr = pStreamDesc->GetMediaTypeHandler(&pHandler);
if (SUCCEEDED(hr))
{
hr = pHandler->GetMediaTypeCount(&cTypes);
}
if (SUCCEEDED(hr))
{
for (DWORD iType = 0; iType < cTypes; iType++)
{
hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);
if (FAILED(hr))
{
break;
}
/* Examine the media type. (Not shown.) */
/* If this media type is acceptable, set the media type. */
if (bTypeOK)
{
hr = pHandler->SetCurrentMediaType(pMediaType);
break;
}
SAFE_RELEASE(pMediaType);
}
}
SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);
İlgili konular