Использование приоритизации потоков
[Функция, связанная с этой страницей, пакет SDK для Windows Media 11, является устаревшей функцией. Он был заменен Читателем источника и Писателем приемника. Source Reader и Sink Writer оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый программный код Source Reader и Sink Writer вместо пакета Windows Media Format 11 SDK, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие 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;
Связанные разделы