Delen via


Het gebruik van stream-prioritering

[De functie die is gekoppeld aan deze pagina, Windows Media Format 11 SDK, is een verouderde functie. Het is vervangen door Source Reader en Sink Writer. Bronlezer en Sink Writer zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken bronlezer en Sink Writer- in plaats van Windows Media Format 11 SDK, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

Met streampriorisatie kunt u meer controle hebben over het afspelen van inhoud door u in staat te stellen prioriteitsvolgorde voor de streams in een profiel op te geven. Wanneer de lezer en streamingserver een bandbreedtetekort ondervinden tijdens het afspelen, moeten voorbeelden mogelijk worden verwijderd om ononderbroken afspelen te bieden. Als u een prioriteitsvolgorde opgeeft met een streampriorisatieobject in het profiel, worden voorbeelden eerst verwijderd uit de laagste prioriteitsstromen.

In tegenstelling tot het delen van bandbreedte en wederzijdse uitsluitingsobjecten, gebruikt een stream prioriteringsobject de IWMStreamList interface niet om de lijst met streams bij te houden. In plaats daarvan moet u een matrix van WM_STREAM_PRIORITY_RECORD structuren gebruiken. De structuren moeten worden ingedeeld in de matrix in aflopende volgorde van prioriteit. Naast het vasthouden van een stroomnummer kunt u met de structuur van de streamprioriteit ook opgeven of een stream verplicht is. Verplichte streams worden niet verwijderd, ongeacht hun positie in de lijst.

In de volgende voorbeeldcode ziet u hoe u een stream-prioriteitsaanduiding in een profiel opneemt. Dit profiel is bedoeld voor een klaspresentatie, met een audiostream van de docent, een videostream van de docent en een videostream voor het vastleggen van de presentatiedia's. De audiostream is het belangrijkste en is verplicht. De dia's hebben de laagste prioriteit omdat de afbeelding vrij constant is, dus een paar frames die hier en daar verloren gaan maken niet veel verschil.

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;

Werken met profielen