ストリームの優先順位付けの使用

[このページに関連付けられている機能である Windows Media Format 11 SDK は、従来の機能です。 ソース リーダーシンク ライターに置き換わりました。 ソース リーダーシンク ライターは、Windows 10とWindows 11用に最適化されています。 Microsoft では、可能であれば、新しいコードで Windows Media Format 11 SDK ではなくソース リーダーシンク ライターを使用することを強くお勧めします。 Microsoft は、レガシ 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;

プロファイルの操作