Utilisation de la hiérarchisation de flux
[La fonctionnalité associée à cette page, le Kit de développement logiciel (SDK) Windows Media Format 11, est une fonctionnalité héritée. Il a été remplacé par lecteur source et enregistreur récepteur. Le lecteur source et l’enregistreur récepteur ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise le lecteur source et l’enregistreur récepteur au lieu du Kit de développement logiciel (SDK) Windows Media Format 11, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
La hiérarchisation des flux vous permet d’avoir plus de contrôle sur la lecture du contenu en vous permettant de spécifier l’ordre de priorité pour les flux dans un profil. Lorsque le lecteur et le serveur de streaming rencontrent une pénurie de bande passante pendant la lecture, les exemples peuvent devoir être supprimés pour fournir une lecture ininterrompue. Si vous spécifiez un ordre de priorité avec un objet de hiérarchisation de flux dans le profil, les exemples sont d’abord supprimés des flux de priorité les plus bas.
Contrairement au partage de bande passante et aux objets d’exclusion mutuelle, un objet de hiérarchisation de flux n’utilise pas l’interface IWMStreamList pour suivre la liste des flux. Au lieu de cela, vous devez utiliser un tableau de structures WM_STREAM_PRIORITY_RECORD . Les structures doivent être organisées dans le tableau dans l’ordre décroissant de priorité. En plus de contenir un numéro de flux, la structure de priorité de flux vous permet également de spécifier si un flux est obligatoire. Les flux obligatoires ne seront pas supprimés, quelle que soit leur position dans la liste.
L’exemple de code suivant montre comment inclure une hiérarchisation de flux dans un profil. Ce profil est destiné à une présentation en classe, avec un flux audio du conférencier parlant, un flux vidéo du conférencier et un flux vidéo capturant les diapositives de la présentation. Le flux audio est le plus important et sera obligatoire. Les diapositives de présentation auront la priorité la plus faible, car l’image sera assez constante, donc quelques images perdues ici et il n’y aura pas beaucoup de différence.
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;
Rubriques connexes