【发布时间】:2017-11-03 09:09:24
【问题描述】:
我想在 UWP 下的 Media Foundation 中使用 c++/cx 选择一个特定的编码器。目前我使用 SinkWriter 并让系统选择默认编码器。
此代码在 UWP 下返回“类未注册”错误,但在 win32 控制台应用程序中有效:
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
MFStartup(MF_VERSION);
IMFTransform* mtf;
CLSID id;
CLSIDFromString(L"{966F107C-8EA2-425D-B822-E4A71BEF01D7}", &id); // "NVIDIA HEVC Encoder MFT"
//CLSIDFromString(L"{F2F84074-8BCA-40BD-9159-E880F673DD3B}", &id); // "H265 Encoder MFT"
//CLSIDFromString(L"{BC10864D-2B34-408F-912A-102B1B867B6C}", &id); // "Intel« Hardware H265 Encoder MFT"
//HRESULT hr = CoCreateInstance(id, nullptr, CLSCTX_INPROC_SERVER, IID_IMFTransform, (void **)&mtf);
HRESULT hr = CoCreateInstance(id, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mtf));
我还注意到 UWP 下的头文件中没有定义 MFTEnumEx(),所以我无法枚举编码器。
我注意到有 C# 文档允许这样的内容:
auto codecQuery = ref new Windows::Media::Core::CodecQuery();
但是使用 c++/cx 时好像不可用。
我还想问一下 SinkWriter 它实际选择了什么编码器,但是这段代码不起作用,因为 ICodecAPI 未定义:
IMFTransform* pEncoder = NULL;
mWriter->GetServiceForStream(MF_SOURCE_READER_FIRST_VIDEO_STREAM, GUID_NULL, IID_IMFTransform, (void**)&pEncoder);
if (pEncoder)
{
ICodecAPI* pCodecApi = NULL;
hr = pEncoder->QueryInterface<ICodecAPI>(&pCodecApi);
}
请帮我选择编码器或找出选择了哪个编码器?
【问题讨论】:
标签: c++ video encoding uwp ms-media-foundation