c++ - MediaFoundation HEVC H265 编码

标签 c++ winapi video-encoding ms-media-foundation hevc

我能够使用 MediaFoundation 成功编码 H264 视频。

现在我想导出 HEVC,根据 official documentation ,支持。

我正在按照那里描述的方式执行所有操作,但是每当我想将输入媒体类型设置为写入器时,都会出现错误:

找不到合适的转换来编码或解码内容。

这是我所做的一个简短代码:

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

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 Average encoded bit rate, in bits per second. Must be greater than zero.

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));

关于c++ - MediaFoundation HEVC H265 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53291761/

相关文章:

c++ - 从另一个线程(子线程)访问QTcpSocket

c++ - 右值引用和构造函数

c++ - 用于可查找电影格式的 C/C++ 库

python - 如何读取 MKV 字节作为视频?

c - Windows 线程 - 调试工作版本没有 - 尝试在线程启动时从线程获取值

ffmpeg - 在 x264 中实现的 CRF 算法

c++ - MFC 输入表单不接受少于 5 个符号

c++ - 访问公共(public)头文件的多个源文件和头文件

winapi - 删除临时文件时Win32文件权限共享冲突

delphi - 如何使用 Delphi 更改服务的权限?