c++ - UWP,媒体基础,选择特定的编码器

标签 c++ video encoding uwp ms-media-foundation

我想使用 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/

相关文章:

c++ - signed/unsigned int 转换发生了什么?

json - 如何使用 YouTube API 获取特定直播视频的当前观看人数?

video - 在哪里可以找到面部检测软件、算法等?

c++ - Blackmagic DirectShow Framerate - 为什么我没有获得我的捕获设备支持的所有视频模式?

字符常量的C编码

c++ - 模板 C++ 中的模板 : <T, V<T>>

c++ - 服务器程序处于无限循环中。如何检查?

c++ - CUDA : NVCC gives controlling expression is constant warning on assert

php - 汉字问题

php - $_SERVER 变量的编码?