首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediaFoundation HEVC H265编码

MediaFoundation HEVC H265编码
EN

Stack Overflow用户
提问于 2018-11-14 01:09:44
回答 2查看 1.9K关注 0票数 2

我能够成功地使用H264对MediaFoundation视频进行编码。

现在我想出口HEVC,这是,根据正式文件,是支持的。

我所做的一切都如上面所述,但每当我想将输入媒体类型设置为写入器时,都会出现一个错误:

没有找到适当的转换来对内容进行编码或解码。

以下是我所做工作的简短代码:

/*设置输出媒体类型*/

代码语言:javascript
复制
IMFMediaType* pMediaTypeOut = nullptr;
MFCreateMediaType(&pMediaTypeOut);
pMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pMediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_HEVC);
MFSetAttributeSize(pMediaTypeOut, MF_MT_FRAME_SIZE, 640, 480);
MFSetAttributeRatio(pMediaTypeOut, MF_MT_FRAME_RATE, 30, 1);
pMediaTypeOut->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH265VProfile_Main_420_8);
pMediaTypeOut->SetUINT32(MF_MT_MPEG2_LEVEL, eAVEncH265VLevel1);

// Add it to the sink writer
m_pWriter->AddStream(pMediaTypeOut, &m_streamIndex);

/*设置输入媒体类型*/

代码语言:javascript
复制
IMFMediaType* pMediaTypeIn = nullptr;
MFCreateMediaType(&pMediaTypeIn);
pMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pMediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
MFSetAttributeSize(pMediaTypeIn, MF_MT_FRAME_SIZE, 640, 480);
MFSetAttributeRatio(pMediaTypeIn, MF_MT_FRAME_RATE, 30, 1),
MFSetAttributeRatio(pMediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1),

// Here it ends up with an error
m_pWriter->SetInputMediaType(m_streamIndex, pMediaTypeIn, nullptr);

有没有人知道HEVC编码是否真的被支持,或者它只是一个文档。如果它真的得到微软的支持,那么我做错了什么呢?

顺便说一句:我使用的是最新版本的Windows 10。为了代码简单起见,省略了错误检查。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-14 01:29:15

也许您可以首先通过h265工具检查DXVA检查器编码器的存在,或者通过编程方式使用编码器,)进行查找。

如果找不到,可以尝试安装MS上的HEVC视频扩展。看起来MS已经将MF编解码器分离为2018年秋季Creator更新后的app包。此外,HEVC编码器需要通过供应商的VGA驱动程序安装。

票数 2
EN

Stack Overflow用户

发布于 2018-11-14 06:45:42

输出媒体类型不完整:

MF_MT_AVG_BITRATE平均编码比特率,以比特每秒为单位。一定大于零。

MF_MT_INTERLACE_MODE也有类似的问题。

工作的代码片段:

代码语言:javascript
复制
Check(MFStartup(MF_VERSION));

ComPtr<IMFSinkWriter> SinkWriter;
Check(MFCreateSinkWriterFromURL(L"D:\\temp.mp4", nullptr, nullptr, SinkWriter.GetAddressOf()));

ComPtr<IMFMediaType> OutputMediaType;
Check(MFCreateMediaType(OutputMediaType.GetAddressOf()));
Check(OutputMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
Check(OutputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_HEVC));
Check(MFSetAttributeSize(OutputMediaType.Get(), MF_MT_FRAME_SIZE, 640, 480));
Check(OutputMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
Check(MFSetAttributeRatio(OutputMediaType.Get(), MF_MT_FRAME_RATE, 30, 1));
//Check(OutputMediaType->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH265VProfile_Main_420_8));
//Check(OutputMediaType->SetUINT32(MF_MT_MPEG2_LEVEL, eAVEncH265VLevel1));
Check(OutputMediaType->SetUINT32(MF_MT_AVG_BITRATE, 1000000));

DWORD StreamIndex;
Check(SinkWriter->AddStream(OutputMediaType.Get(), &StreamIndex));

ComPtr<IMFMediaType> InputMediaType;
Check(MFCreateMediaType(InputMediaType.GetAddressOf()));
Check(InputMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
Check(InputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12));
Check(MFSetAttributeSize(InputMediaType.Get(), MF_MT_FRAME_SIZE, 640, 480));
Check(InputMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
Check(MFSetAttributeRatio(InputMediaType.Get(), MF_MT_FRAME_RATE, 30, 1)),
//Check(MFSetAttributeRatio(InputMediaType.Get(), MF_MT_PIXEL_ASPECT_RATIO, 1, 1)),

Check(SinkWriter->SetInputMediaType(StreamIndex, InputMediaType.Get(), nullptr));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53291761

复制
相关文章

相似问题

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