Menggunakan Prioritas Aliran

[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Prioritas streaming memungkinkan Anda memiliki kontrol lebih besar atas pemutaran konten dengan memungkinkan Anda menentukan urutan prioritas untuk aliran di profil. Ketika pembaca dan server streaming mengalami kekurangan bandwidth selama pemutaran, sampel mungkin harus dihilangkan untuk menyediakan pemutaran tanpa gangguan. Jika Anda menentukan urutan prioritas dengan objek prioritas aliran di profil, sampel akan dihilangkan dari aliran prioritas terendah terlebih dahulu.

Tidak seperti berbagi bandwidth dan objek pengecualian timbal balik, objek prioritas aliran tidak menggunakan antarmuka IWMStreamList untuk melacak daftar aliran. Sebagai gantinya, Anda harus menggunakan array struktur WM_STREAM_PRIORITY_RECORD . Struktur harus diatur dalam array dalam urutan prioritas menurun. Selain menyimpan nomor aliran, struktur prioritas aliran juga memungkinkan Anda menentukan apakah aliran wajib. Aliran wajib tidak akan dihilangkan, terlepas dari posisinya dalam daftar.

Contoh kode berikut menunjukkan cara menyertakan prioritas aliran dalam profil. Profil ini untuk presentasi ruang kelas, dengan aliran audio dosen berbicara, aliran video dosen, dan aliran video yang menangkap slide presentasi. Aliran audio adalah yang paling penting dan akan wajib. Slide presentasi akan memiliki prioritas terendah karena gambar akan cukup konstan, sehingga beberapa bingkai hilang di sini dan tidak akan ada banyak perbedaan.

IWMProfileManager*       pProfileMgr = NULL;
IWMProfile*              pProfileTmp = NULL;
IWMProfile3*             pProfile    = NULL;
IWMStreamPrioritization* pPriority   = NULL;

WM_STREAM_PRIORITY_RECORD StreamArray[3];
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a profile manager object.
hr = WMCreateProfileManager(&pProfileMgr);

// Create an empty profile.
hr = pProfileMgr->CreateEmptyProfile(WMT_VER_9_0, &pProfileTmp)

// Get the IWMProfile3 for the new profile, then release the old one.
hr = pProfileTmp->QueryInterface(IID_IWMProfile3, (void**)&pProfile);
pProfileTmp->Release();
pProfileTmp = NULL;

// Give the new profile a name and description.
hr = pProfile->SetName(L"Prioritization_Example");
hr = pProfile->SetDescription(L"Only for use with example code.");

// Create the first stream.
hr = pProfile->CreateNewStream(WMMEDIATYPE_Audio, &pStream);

// TODO: configure the stream as needed for the scenario.

// Set the stream number.
hr = pStream->SetStreamNumber(1);

// Give the stream a name for clarity.
hr = pStream->SetStreamName(L"Lecturer_Audio");

// Include the new stream in the profile.
hr = pProfile->AddStream(pStream);

// Release the stream configuration interface.
pStream->Release();
pStream = NULL;

// Repeat for the other two streams.
hr = pProfile->CreateNewStream(WMMEDIATYPE_Video, &pStream);

// TODO: configure the stream as needed for the scenario.
hr = pStream->SetStreamNumber(2);
hr = pStream->SetStreamName(L"Lecturer_Video");
hr = pProfile->AddStream(pStream);
pStream->Release();
pStream = NULL;

hr = pProfile->CreateNewStream(WMMEDIATYPE_Video, &pStream);

// TODO: configure the stream as needed for the scenario.
hr = pStream->SetStreamNumber(3);
hr = pStream->SetStreamName(L"Slide_Video");
hr = pProfile->AddStream(pStream);
pStream->Release();
pStream = NULL;

// Create a stream prioritization object.
hr = pProfile->CreateNewStreamPrioritization(&pPriority);

// Fill the array with data.
StreamArray[0].wStreamNum = 1;
StreamArray[0].fMandatory = TRUE;

StreamArray[1].wStreamNum = 2;
StreamArray[1].fMandatory = FALSE;

StreamArray[2].wStreamNum = 3;
StreamArray[2].fMandatory = FALSE;

// Assign the stream array to the stream prioritization object.
hr = pPriority->SetPriorityRecords(StreamArray, 3);

// Add the stream prioritization to the profile.
hr = pProfile->SetStreamPrioritization(pPriority);

// Release the stream prioritization object.
pPriority->Release();
pPriority = NULL;

// TODO: Save the profile to a string, and save the string to a file.
// For more information, see To Save a Custom Profile.

// Release the remaining interfaces.
pProfile->Release();
pProfile = NULL;

pProfileMgr->Release();
pProfileMgr = NULL;

Bekerja dengan Profil