Uso del resolver di origine
Il resolver di origine accetta un URL o un flusso di byte e crea l'origine multimediale appropriata per tale contenuto. Per creare il sistema di risoluzione di origine, chiamare MFCreateSourceResolver. Questa funzione restituisce un puntatore a interfaccia IMFSourceResolver.
Il sistema di risoluzione di origine include sia metodi sincroni che asincroni. Se si usa il resolver di origine dal thread dell'applicazione principale, i metodi asincroni renderanno l'interfaccia utente più reattiva. I metodi sincroni possono bloccare per una notevole quantità di tempo, in particolare se il resolver di origine deve aprire una risorsa di rete.
I metodi sincroni sono:
I metodi asincroni sono:
Per i metodi asincroni, ogni metodo ha un metodo End... corrispondente per completare la richiesta asincrona e un metodo Cancel... per annullare una richiesta in sospeso. Per altre informazioni sui metodi asincroni in Media Foundation, vedere i metodi di callback asincroni.
Nell'esempio di codice seguente viene creata un'origine multimediale da un URL. In questo esempio viene usato il metodo sincrono.
// Create a media source from a URL.
HRESULT CreateMediaSource(PCWSTR sURL, IMFMediaSource **ppSource)
{
MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;
IMFSourceResolver* pSourceResolver = NULL;
IUnknown* pSource = NULL;
// Create the source resolver.
HRESULT hr = MFCreateSourceResolver(&pSourceResolver);
if (FAILED(hr))
{
goto done;
}
// Use the source resolver to create the media source.
// Note: For simplicity this sample uses the synchronous method to create
// the media source. However, creating a media source can take a noticeable
// amount of time, especially for a network source. For a more responsive
// UI, use the asynchronous BeginCreateObjectFromURL method.
hr = pSourceResolver->CreateObjectFromURL(
sURL, // URL of the source.
MF_RESOLUTION_MEDIASOURCE, // Create a source object.
NULL, // Optional property store.
&ObjectType, // Receives the created object type.
&pSource // Receives a pointer to the media source.
);
if (FAILED(hr))
{
goto done;
}
// Get the IMFMediaSource interface from the media source.
hr = pSource->QueryInterface(IID_PPV_ARGS(ppSource));
done:
SafeRelease(&pSourceResolver);
SafeRelease(&pSource);
return hr;
}
Argomenti correlati