Membuat Encoder dengan Menggunakan CoCreateInstance
Untuk mengonversi file media menjadi format ASF, Anda dapat menggunakan encoder Windows Media. Untuk menggunakan encoder ini, mereka harus terdaftar di sistem. Encoder diimplementasikan sebagai transformasi Media Foundation (MFTs) dan harus mengekspos antarmuka IMFTransform. Topik ini menjelaskan bagaimana aplikasi bisa mendapatkan penunjuk ke antarmuka IMFTransform encoder MFT yang diperlukan dan membuat instansnya untuk digunakan.
Untuk informasi tentang pendaftaran encoder, lihat Membuat instans MFT Encoder.
Menggunakan Antarmuka IMFTransform Encoder
Setelah pendaftaran encoder Windows Media berhasil dengan sistem, aplikasi dapat menghitung encoder dengan memanggil MFTEnum. Untuk mencari encoder yang tepat, Anda harus menentukan hal berikut:
GUID yang mewakili kategori, yang MFT_CATEGORY_AUDIO_ENCODER atau MFT_CATEGORY_VIDEO_ENCODER.
Format yang cocok. Ini diatur dalam struktur MFT_REGISTER_TYPE_INFO yang menentukan jenis utama dan subtipe jenis media tempat encoder akan menghasilkan sampel. Struktur ini diteruskan dalam parameter pOutputType . Untuk informasi tentang jenis yang didukung, lihat GUID Jenis Media.
Catatan
Informasi jenis input dalam parameter pInputType tidak diperlukan. Ini karena jenis input diketahui oleh aplikasi dan encoder mengharapkan aliran input berada dalam format yang tidak dikompresi.
MFTEnum mengembalikan array penunjuk IMFTransform untuk MFTs encoder yang cocok dengan kriteria pencarian. Anda dapat membuat instans encoder dengan memanggil fungsi COM CoCreateInstance dan meneruskan CLSID encoder yang ingin Anda gunakan. Fungsi ini mengembalikan penunjuk ke antarmuka IMFTransform yang mewakili encoder. Untuk informasi selengkapnya tentang panggilan fungsi ini, lihat dokumentasi Windows SDK untuk Model Objek Komponen (COM).
Contoh Pembuatan Encoder
Contoh kode berikut menunjukkan cara membuat encoder audio atau video.
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;
}
Topik terkait