c++ - MediaFoundation HEVC H265 编码
问题描述
我能够使用 MediaFoundation 成功编码 H264 视频。
现在我想导出 HEVC,根据官方文档,它是受支持的。
我正在按照那里的描述做所有事情,但是每当我想为编写器设置输入媒体类型时,都会出现错误:
没有找到合适的转换来对内容进行编码或解码。
这是我所做的简短代码:
/* 设置输出媒体类型 */
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);
/* 设置输入媒体类型 */
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。为简化代码,省略了错误检查
解决方案
您的输出媒体类型不完整:
MF_MT_AVG_BITRATE
平均编码比特率,以比特/秒为单位。必须大于零。
类似的问题MF_MT_INTERLACE_MODE
。
有效的代码片段:
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));
推荐阅读
- python - 执行在 Python 中返回后可能完成的并行任务
- bash - 我搞砸了我的路径吗?.bash_profile
- javascript - tinyMCE - 是否可以修改图像高级选项卡以包含所有边距(左、右、上、下)?
- angularjs - AngularJS 当我点击一个链接时我想过滤一个数组
- asp.net-core - 在asp.net核心中进行上传时如何获取图像宽度和高度
- c# - Visual Studio 扩展中的参考 Collections.Immutable
- python - Python-Pygame 不会显示图像或标题
- angularjs - 单击按钮时的Angularjs路由不起作用
- jenkins - 我是否能够绕过 Jenkins tsl 错误并继续构建?
- javascript - 当我在函数上使用 javascript 代码时,它不起作用