Share via


Uso de la priorización de flujos

[La característica asociada a esta página, WINDOWS Media Format 11 SDK, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. Lector de origen y escritor receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector fuente y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

La priorización de secuencias permite tener más control sobre la reproducción de contenido, ya que permite especificar el orden de prioridad de las secuencias de un perfil. Cuando el lector y el servidor de streaming encuentran una escasez de ancho de banda durante la reproducción, es posible que las muestras deban quitarse para proporcionar reproducción ininterrumpida. Si especifica un orden de prioridad con un objeto de priorización de flujos en el perfil, los ejemplos se quitarán primero de las secuencias de prioridad más baja.

A diferencia del uso compartido de ancho de banda y los objetos de exclusión mutua, un objeto de priorización de flujos no usa la interfaz IWMStreamList para realizar un seguimiento de la lista de secuencias. En su lugar, debe usar una matriz de estructuras WM_STREAM_PRIORITY_RECORD . Las estructuras deben organizarse en la matriz en orden descendente de prioridad. Además de contener un número de flujo, la estructura de prioridad de flujo también permite especificar si una secuencia es obligatoria. Las secuencias obligatorias no se quitarán, independientemente de su posición en la lista.

En el código de ejemplo siguiente se muestra cómo incluir una priorización de flujos en un perfil. Este perfil es para una presentación de clase, con una secuencia de audio del profesor hablando, una secuencia de vídeo del profesor y una secuencia de vídeo que captura las diapositivas de la presentación. La secuencia de audio es la más importante y será obligatoria. Las diapositivas de presentación tendrán la prioridad más baja porque la imagen será bastante constante, por lo que algunos fotogramas perdidos aquí y no habrá mucha diferencia.

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;

Trabajar con perfiles