首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UWP,Media Foundation,选择特定编码器

UWP,Media Foundation,选择特定编码器
EN

Stack Overflow用户
提问于 2017-11-03 17:09:25
回答 2查看 655关注 0票数 1

我想使用c++/cx在UWP下的Media Foundation中选择一个特定的编码器。目前,我使用SinkWriter,并让系统选择默认编码器。

此代码在UWP下返回"class not registered“错误,但它在win32控制台应用程序中工作:

代码语言:javascript
复制
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));

我还注意到MFTEnumEx()没有在UWP下的头文件中定义,所以我不能枚举编码器。

我注意到有C#文档允许这样的东西:

代码语言:javascript
复制
auto codecQuery = ref new Windows::Media::Core::CodecQuery();

但它似乎在使用c++/cx时不可用。

我还想问SinkWriter它实际选择的编码器是什么,但此代码不起作用,因为ICodecAPI是未定义的:

代码语言:javascript
复制
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);
}

请帮我选择编码器或找出选择了哪个编码器?

EN

回答 2

Stack Overflow用户

发布于 2017-11-03 17:50:20

Media Foundation不提供使用接收器编写器API指定编码器的灵活性。您只能使用MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS attribute指示使用或不使用硬件编码器

使源读取器或接收器写入器能够使用基于硬件的媒体基础转换(MFT)。

一旦设置了Sink Writer,您就可以使用IMFSinkWriterEx::GetTransformForStream枚举为处理准备的转换,并从枚举中挑选编码器。这将使您了解实际使用的编码器。

Media Foundation Sink Writer API保留解码要使用的编码器的权利。通常,如果您希望使用经过认证的兼容编码器,尤其是在启用Direct3D方案时。

最后,我不确定其中哪些可用于C++/CX,但您的代码片段表明所提到的API是可用的。

要使用您选择的编码器,您应该使用Media Foundation Media Session API,而不是Sink Writer。

票数 0
EN

Stack Overflow用户

发布于 2017-11-07 20:14:50

谢谢你罗曼。我试过GetTranformForStream了。使用nvidia驱动程序,我可以获得IMFTransform的属性:

代码语言:javascript
复制
{206B4FC8-FCF9-4C51-AFE3-9764369E33A0}=1,
{2FB866AC-B078-4942-AB6C-003D05CDA674}=NVIDIA HEVC Encoder MFT,
FRIENDLY_NAME_Attribute=NVIDIA HEVC Encoder MFT,
{3AECB0CC-035B-4BCC-8185-2B8D551EF3AF}=VEN_10DE,
MAJOR_TYPE=Video,
{53476A11-3F13-49FB-AC42-EE2733C96741}=1,
{86A355AE-3A77-4EC4-9F31-01149A4E92DE}=1,
{88A7CB15-7B07-4A34-9128-E64C6703C4D3}=8,
{E3F2E203-D445-4B8C-9211-AE390D3BA017}=2303214,
{E5666D6B-3422-4EB6-A421-DA7DB1F8E207}=1,
{F34B9093-05E0-4B16-993D-3E2A2CDE6AD3}=860522,
SUBTYPE=Base,
{F81A699A-649A-497D-8C73-29F8FED6AD7A}=1,

禁用nvidia驱动程序时,我只能看到:

代码语言:javascript
复制
{86A355AE-3A77-4EC4-9F31-01149A4E92DE}=1

我想知道最后一个转换是否是几个转换的列表?如何获取它们?我可以从sinkwriter遍历拓扑吗?

我的pc有以下编解码器,我可以使用它们:

代码语言:javascript
复制
{966F107C-8EA2-425D-B822-E4A71BEF01D7}   // "NVIDIA HEVC Encoder MFT"
{F2F84074-8BCA-40BD-9159-E880F673DD3B} // "H265 Encoder MFT"
{BC10864D-2B34-408F-912A-102B1B867B6C} // "Intel« Hardware H265 Encoder MFT"

在nvidia的例子中,我得到了一个有意义的字符串,但当它显然不是nvidia (Intel或软件)时就不是了。

现在,我还将尝试按照您的建议研究Media Session API。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47091966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档