Skapa en kodare med Hjälp av CoCreateInstance
Om du vill konvertera mediefiler till ASF-format kan du använda Windows Media-kodare. Om du vill använda dessa kodare måste de vara registrerade i systemet. Kodare implementeras som Media Foundation transformerar (MFI) och måste exponera IMFTransform-gränssnittet. Det här avsnittet beskriver hur ett program kan få en pekare till MFT-kodarens IMFTransform-gränssnitt och instansiera det för användning.
Information om kodarregistrering finns i Instantiating an Encoder MFT.
Använda en kodares IMFTransform-gränssnitt
Vid lyckad registrering av Windows Media-kodare med systemet kan ett program räkna upp kodarna genom att anropa MFTEnum. Om du vill söka efter rätt kodare måste du ange följande:
GUID som representerar kategorin, vilken antingen är MFT_CATEGORY_AUDIO_ENCODER eller MFT_CATEGORY_VIDEO_ENCODER.
Formatet att matcha Detta anges i den MFT_REGISTER_TYPE_INFO struktur som anger huvudtypen och undertypen för medietypen som kodaren ska generera exempel i. Den här strukturen skickas i parametern pOutputType. Information om vilka typer som stöds finns i MEDIA Type GUIDs.
Notera
Indatatypsinformationen i parametern pInputType krävs inte. Det beror på att indatatypen är känd för programmet och kodaren förväntar sig att indataströmmen ska vara i ett okomprimerat format.
MFTEnum returnerar en matris med IMFTransform pekare för kodarens MFT som matchar sökvillkoren. Du kan instansiera en kodare genom att anropa COM-funktionen CoCreateInstance och skicka CLSID för kodaren som du vill använda. Den här funktionen returnerar en pekare till IMFTransform- gränssnitt som representerar kodaren. Mer information om det här funktionsanropet finns i Windows SDK-dokumentationen för komponentobjektmodellen (COM).
Exempel på att skapa kodare
I följande kodexempel visas hur du skapar en ljud- eller videokodare.
HRESULT FindEncoder(
const GUID& subtype,
BOOL bAudio,
IMFTransform **ppEncoder
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
CLSID *ppCLSIDs = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
0, // Reserved
NULL, // Input type
&info, // Output type
NULL, // Reserved
&ppCLSIDs,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first encoder in the list.
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(ppCLSIDs[0], NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppEncoder));
}
CoTaskMemFree(ppCLSIDs);
return hr;
}
Relaterade ämnen