【问题标题】:IMFTransform covert camera stream color format, IMFTransform::ProcessOutput returns freeze image dataIMFTransform 隐蔽摄像机流颜色格式,IMFTransform::ProcessOutput 返回冻结图像数据
【发布时间】:2019-03-24 17:00:56
【问题描述】:

我对 Windows Media Foundation API 非常陌生。我尝试创建一个可以显示和操作摄像头视频输入流的程序。
我正在使用 Media Foundation 进行视频流读取,支持的颜色格式为 NV12,因此我必须将其转换为 RGBARGB 以创建 Opengl 纹理对象。
我尝试在 CPU 端使用纯 c++ 代码来实现,但性能非常糟糕。然后我尝试使用IMFTranform进行颜色转换,性能非常好,但我遇到了一个奇怪的问题。
IMFTransform::Process返回S_OK,但我一直得到冻结的图像输出。结果图像像素不是实时更新的,一直冻结很多帧,而且冻结时间越来越长。如果我使用纯 c++ 代码进行颜色转换,那么一切正常。

这是我的代码,https://gist.github.com/zhiqiang-li/16d1a6a1b00e8fb39847c8ca323b5604。请让我知道你认为我做错了什么。

【问题讨论】:

    标签: camera ms-media-foundation color-conversion


    【解决方案1】:

    您是否尝试让 SourceReader 为您进行转换:

    hr = mAttributes->SetUINT32(MF_READWRITE_DISABLE_CONVERTERS, FALSE);
    

    默认情况下,源读取器和接收器写入器可以对未压缩的音频和视频流进行一些格式转换。要禁用此行为,请在创建源读取器或接收器写入器时将此属性设置为 TRUE。

    默认情况下它是 FALSE,所以你不需要显式设置这个属性。

    然后:

    hr = mSourceReader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);
    

    与:

    mOutputMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12);
    

    同样根据 NV12 格式 (MF_MT_FRAME_SIZE) 计算图像大小。不要设置 MF_MT_DEFAULT_STRIDE,SourceReader 会为你做。

    所以想法是从 SourceReader 获取 NV12 格式,即使捕获源提供 RGB32 格式。 SourceReader 通常能够做到这一点。

    【讨论】:

    • 我也面临与 SinkWriter 类似的问题。您能建议如何计算 NV12 格式的 MF_MT_FRAME_SIZE 吗?
    • 只是除以 1.5 吗?
    • 其实MF_MT_FRAME_SIZE是一个视频帧的Width和height,以像素为单位。不需要像我说的那样计算。计算是在使用 IMFBuffer 时进行的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多