Использование определения приоритетов потоков
[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Определение приоритетов потоков позволяет иметь больший контроль над воспроизведением содержимого, позволяя указать порядок приоритета для потоков в профиле. Когда во время воспроизведения на сервере чтения и потоковой передачи возникает нехватка пропускной способности, может потребоваться удалить примеры, чтобы обеспечить непрерывное воспроизведение. Если указать порядок приоритета с объектом определения приоритетов потока в профиле, примеры сначала будут удалены из потоков с самым низким приоритетом.
В отличие от объектов совместного использования пропускной способности и взаимного исключения, объект определения приоритетов потока не использует интерфейс IWMStreamList для отслеживания списка потоков. Вместо этого необходимо использовать массив WM_STREAM_PRIORITY_RECORD структур. Структуры должны быть упорядочены в массиве в порядке убывания приоритета. Помимо хранения номера потока, структура приоритета потока также позволяет указать, является ли поток обязательным. Обязательные потоки не будут удалены, независимо от их положения в списке.
В следующем примере кода показано, как включить определение приоритетов потока в профиль. Этот профиль предназначен для презентации в классе с аудиопотоком выступающего лектора, видеопотоком преподавателя и видеопотоком, захватывающим слайды презентации. Аудиопоток является наиболее важным и будет обязательным. Слайды презентации будут иметь самый низкий приоритет, так как изображение будет довольно постоянным, поэтому несколько кадров, потерянных здесь и там, не будут иметь большого значения.
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;
Связанные темы