Deskriptor Presentasi
Presentasi adalah sekumpulan aliran media terkait yang berbagi waktu presentasi umum. Misalnya, presentasi mungkin terdiri dari aliran audio dan video dari film. Deskriptor presentasi adalah objek yang berisi deskripsi presentasi tertentu. Deskriptor presentasi digunakan untuk mengonfigurasi sumber media dan beberapa sink media.
Setiap deskriptor presentasi berisi daftar satu atau beberapa deskriptor aliran. Ini menjelaskan aliran dalam presentasi. Aliran dapat dipilih atau tidak dipilih. Hanya aliran yang dipilih yang menghasilkan data. Aliran yang tidak dipilih tidak aktif dan tidak menghasilkan data apa pun. Setiap deskriptor aliran memiliki penangan jenis media, yang digunakan untuk mengubah jenis media aliran atau mendapatkan jenis media streaming saat ini. (Untuk informasi selengkapnya tentang jenis media, lihat Jenis Media.)
Tabel berikut menunjukkan antarmuka utama yang diekspos masing-masing objek ini.
Object | Antarmuka |
---|---|
Deskriptor presentasi | IMFPresentationDescriptor |
Deskriptor aliran | IMFStreamDescriptor |
Penangan tipe media | IMFMediaTypeHandler |
Presentasi Sumber Media
Setiap sumber media menyediakan deskriptor presentasi yang menjelaskan konfigurasi default untuk sumbernya. Dalam konfigurasi default, setidaknya satu aliran dipilih, dan setiap aliran yang dipilih memiliki jenis media. Untuk mendapatkan deskriptor presentasi, panggil IMFMediaSource::CreatePresentationDescriptor. Metode mengembalikan penunjuk IMFPresentationDescriptor .
Anda dapat mengubah deskriptor presentasi sumber untuk memilih set aliran yang berbeda. Jangan ubah deskriptor presentasi kecuali sumber media dihentikan. Perubahan diterapkan saat Anda memanggil IMFMediaSource::Start untuk memulai sumber.
Untuk mendapatkan jumlah aliran, panggil IMFPresentationDescriptor::GetStreamDescriptorCount. Untuk mendapatkan deskriptor aliran untuk aliran, panggil IMFPresentationDescriptor::GetStreamDescriptorByIndex dan teruskan indeks aliran. Aliran diindeks dari nol. Metode GetStreamDescriptorByIndex mengembalikan penunjuk IMFStreamDescriptor . Ini juga mengembalikan bendera Boolean yang menunjukkan apakah aliran dipilih. Jika aliran dipilih, sumber media menghasilkan data untuk aliran tersebut. Jika tidak, sumber tidak menghasilkan data apa pun untuk aliran tersebut. Untuk memilih aliran, panggil IMFPresentationDescriptor::SelectStream dengan indeks aliran. Untuk membatalkan pilihan aliran, panggil IMFPresentationDescriptor::D eselectStream.
Kode berikut menunjukkan cara mendapatkan deskriptor presentasi dari sumber media dan menghitung aliran.
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);
Penangan Tipe Media
Untuk mengubah jenis media aliran atau untuk mendapatkan jenis media streaming saat ini, gunakan penangan jenis media deskriptor aliran. Panggil IMFStreamDescriptor::GetMediaTypeHandler untuk mendapatkan handler jenis media. Metode ini mengembalikan penunjuk IMFMediaTypeHandler .
Jika Anda hanya ingin tahu jenis data apa yang ada di aliran, seperti audio atau video, panggil IMFMediaTypeHandler::GetMajorType. Metode ini mengembalikan GUID untuk jenis media utama. Misalnya, aplikasi pemutaran biasanya menghubungkan aliran audio ke perender audio dan aliran video ke perender video. Jika Anda menggunakan Sesi Media atau pemuat topologi untuk membangun topologi, GUID jenis utama mungkin menjadi satu-satunya informasi format yang Anda butuhkan.
Jika aplikasi Anda memerlukan informasi lebih rinci tentang format saat ini, panggil IMFMediaTypeHandler::GetCurrentMediaType. Metode ini mengembalikan penunjuk ke antarmuka IMFMediaType dari jenis media. Gunakan antarmuka ini untuk mendapatkan detail format.
Penangan jenis media juga berisi daftar jenis media yang didukung untuk aliran. Untuk mendapatkan ukuran daftar, panggil IMFMediaTypeHandler::GetMediaTypeCount. Untuk mendapatkan jenis media dari daftar, panggil IMFMediaTypeHandler::GetMediaTypeByIndex dengan indeks jenis media. Jenis media dikembalikan dalam perkiraan urutan preferensi. Misalnya, untuk format audio, laju sampel yang lebih tinggi lebih disukai daripada laju sampel yang lebih rendah. Namun, tidak ada aturan definitif yang mengatur pengurutan, jadi Anda harus memperlakukannya hanya sebagai pedoman.
Daftar jenis yang didukung mungkin tidak berisi setiap jenis media yang mungkin didukung aliran. Untuk menguji apakah jenis media tertentu didukung, panggil IMFMediaTypeHandler::IsMediaTypeSupported. Untuk mengatur jenis media, panggil IMFMediaTypeHandler::SetCurrentMediaType. Jika metode berhasil, aliran akan berisi data yang sesuai dengan format yang ditentukan. Metode SetCurrentMediaType tidak mengubah daftar jenis pilihan.
Kode berikut menunjukkan cara mendapatkan penangan jenis media, menghitung jenis media pilihan, dan mengatur jenis media. Contoh ini mengasumsikan bahwa aplikasi memiliki beberapa algoritma, tidak ditampilkan di sini, untuk memilih jenis media. Spesifikasinya akan sangat tergantung pada aplikasi Anda.
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);
Topik terkait