我想使用 c++/cx 在 UWP 下的 Media Foundation 中选择一个特定的编码器。目前我使用 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);
}
请帮我选择编码器或找出选择了哪个编码器?
最佳答案
Media Foundation 不提供使用 Sink Writer API 指定编码器的灵 active 。您只能指示使用或不使用硬件编码器,使用MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS
attribute :
Enables the source reader or sink writer to use hardware-based Media Foundation transforms (MFTs).
设置好 Sink Writer 后,您可以使用 IMFSinkWriterEx::GetTransformForStream
枚举 API 为处理准备的转换,并从枚举中选择编码器。这将使您了解实际使用的是什么编码器。
Media Foundation Sink Writer API 保留解码使用哪个编码器的权利。通常情况下,如果您更喜欢经过认证的兼容编码器,尤其是在启用 Direct3D 方案的情况下。
最后,我不确定其中哪些适用于 C++/CX,但您的代码片段表明上述 API 可用。
要使用您选择的编码器,您应该使用 Media Foundation Media Session API,而不是 Sink Writer。
关于c++ - UWP,媒体基础,选择特定的编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47091966/