我正在尝试使用 H.264 视频解码器 创建 MP4 解码器。我无法在对
CLSID_CMSH264DecoderMFT
的调用中使用 CoCreateInstance()
,因为我收到链接器错误:
无法解析的外部符号CLSID_CMSH264DecoderMFT
里面
C:\Windows\System32
我确实有msmpeg2vdec.dll
。我尝试从这里下载另一个,但我无法替换原来的,它不允许我。
这些是我链接的库:
Urlmon.lib
Mfreadwrite.lib
mf.lib
mfplat.lib
mfuuid.lib
strmiids.lib
Ole32.lib
Uuid.lib
这些是我的内容:
#include <windows.h>
#include <mfapi.h>
#include <mfplay.h>
#include <mfobjects.h>
#include <mfidl.h>
#include <mfreadwrite.h>
#include <d3d9.h>
#include <objbase.h>
#include <iostream>
#include <vector>
#include <dshow.h>
#include <initguid.h>
#include <wmcodecdsp.h> // <- contains CLSID_CMSH264DecoderMFT
#include <stdio.h>
regsvr32 MSMPEG2VDEC.DLL
IMFTransform::SetOutputType
这是使用
MFTEnum
时的代码,在最后一个 cout
上失败:
MFT_REGISTER_TYPE_INFO tyin = {};
tyin.guidMajorType = MFMediaType_Video;
tyin.guidSubtype = MFVideoFormat_H264;
MFT_REGISTER_TYPE_INFO tyout = {};
tyout.guidMajorType = MFMediaType_Video;
tyout.guidSubtype = MFVideoFormat_NV12;
CLSID* clsid_arr=0;
UINT32 clsid_arr_count;
hr = MFTEnum(
MFT_CATEGORY_VIDEO_DECODER,
0,
&tyin,
&tyout,
0,
&clsid_arr,
&clsid_arr_count
); // finds 1
IMFTransform* pDecoder=0;
CoCreateInstance(clsid_arr[0], NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDecoder));
IMFMediaType* type = 0;
MFCreateMediaType(&type);
type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
hr = pDecoder->SetInputType(0, type, 0);
IMFMediaType* pOutputAttributes = 0;
MFCreateMediaType(&pOutputAttributes);
pOutputAttributes->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pOutputAttributes->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
hr = pDecoder->SetOutputType(0, pOutputAttributes, 0);
if (FAILED(hr)) {
std::cout << "Failed SetOutputType\n";
}
CLSID_CMSH264DecoderMFT
在 extern
中声明为 wmcodecdsp.h
。 链接器抱怨它在任何地方都找不到 CLSID
值的定义,例如在 .lib
文件中,因此出现错误。 如果你没有这样的 .lib
文件,那么直接在自己的代码中定义该值即可,例如:
const CLSID CLSID_CMSH264DecoderMFT = {0x62CE7E72, 0x4C71, 0x4d20, {0xB1, 0x5D, 0x45, 0x28, 0x31, 0xA8, 0x7D, 0x9D}};