none
有没有API可以实现高效显示图像? RRS feed

  • 问题

  • 有没有一套接口可以设置显卡并使显卡自动读取图像数据显示到窗口而不需要内存拷贝? 

    我想实现低CPU使用率的摄像头采集画面显示程序. 如果显卡能够自动读取采集到的图像数据就不需要占用CPU了



    2014年6月20日 11:50

答案

  • DXVA 2.0


    Visual C++ MVP

    2014年6月21日 6:09
    版主
  • 编码解码的瓶颈就是应该在内存带宽不应该在CPU。GPU和CPU之间内存复制太多的话,考虑换一个压缩的格式。很多显卡都支持MPEG、WMV、VC-1和H.264解码的。你可以把数据压缩之后再传给GPU,后续的图像处理全部在GPU里面做,尽量减少CPU和GPU之间的内存交换(这个要过很挤的北桥)。这会增加一些CPU的负担(需要压缩原始图像)但是后续工作会节省很多CPU时间。



    Visual C++ MVP

    • 已标记为答案 sainimu78 2014年7月13日 12:37
    2014年7月12日 16:49
    版主

全部回复

  • DXVA 2.0


    Visual C++ MVP

    2014年6月21日 6:09
    版主
  • 谢谢

    我试跑了 SDK中的例子 Microsoft SDKs\Windows\v7.1\Samples\multimedia\mediafoundation\dxva2_videoproc

    运行效果看来 程序的CPU使用率确实很低, 基本保持在0%到2%, 但该示例并不是显示图片的.

    我觉得DXVA的接口挺复杂, 不是我一两下就能研究透彻的. 

    那么凭您的经验, DXVA2能不能实现这样要求: DXVA有某些个接口可以接受一个可变化的图像数据缓冲的地址, 调用该接口后, 可以直接或再做某些工作后, 就能在窗口上显示图像, 并且保持0%到2%的CPU使用率.

    2014年6月23日 9:18
  • DXVA本来用的就不是CPU。MFT支持你自己写的source reader作为数据源。



    Visual C++ MVP

    2014年6月23日 19:28
    版主
  • 用dxva2, 显示800X600的图片与显示1920*1200的图片, CPU使用率会相同吗? 处理时间相同吗 
    2014年7月11日 8:45
  • 今天我做实验了, 用示例代码dxva2_videoproc修改显示图片, dxva2_videoproc原本是显示色块的, 这其实和显示图片没有区别, 但显示的色块并不会变化, 于是我需要将dxva2_videoproc修改成能显示持续变化的图片并且是较大分辨率, 这样才能模拟视频显示的画面.

    我在UpdateSubStream()函数里加入修改图片数据的程序, 每次执行UpdateSubStream()都会修改图片的一个像素, 将该像素设置为黑色, 效果就是显示的画面会被逐行刷成黑色.

    实验结果显示, CPU使用率很高, 近50%, 当然这和我的电脑性能有关, 但总之, 这个被我修改后的程序在更好的PC上运行时, CPU使用率肯定也不低, 我明白这CPU使用率主要是在RGB转YUV和大尺寸图片内存复制造成的.

    我想避免RGB转YUV, 

    但将Vg_pDXVAVPS->CreateSurface(..., VIDEO_SUB_FORMAT, ... )中的VIDEO_SUB_FORMAT设为D3DFMT_R8G8_B8G8, 则该创建函数返回失败了.  目前只能用RGB转YUV的办法.

    如果说可以通过某种办法设置显卡使显卡能自动来读取图片的缓存, 那就可以避免大内存复制, 但dxva2_videoproc示例并没有展示如此的用法. 能再给我些建议吗?

    2014年7月12日 13:09
  • 你用ffmpeg把一个YUV源文件转成rgb看看用多少的CPU。没记错的话,有DXVA支持的话它是尽量用DXVA的。


    Visual C++ MVP

    2014年7月12日 15:05
    版主
  • 复制大块内存不仅增加CPU使用率还大减帧率, 怎么办?
    2014年7月12日 16:05
  • 编码解码的瓶颈就是应该在内存带宽不应该在CPU。GPU和CPU之间内存复制太多的话,考虑换一个压缩的格式。很多显卡都支持MPEG、WMV、VC-1和H.264解码的。你可以把数据压缩之后再传给GPU,后续的图像处理全部在GPU里面做,尽量减少CPU和GPU之间的内存交换(这个要过很挤的北桥)。这会增加一些CPU的负担(需要压缩原始图像)但是后续工作会节省很多CPU时间。



    Visual C++ MVP

    • 已标记为答案 sainimu78 2014年7月13日 12:37
    2014年7月12日 16:49
    版主
  • 这方案好, 感谢, 那么可用哪套接口实现? sdk的哪个示例?
    2014年7月13日 12:36
  • 没有一个完整的示例……WMV的编码可以参考Windows Media Format SDK,其他标准格式的代码更多。显卡解码不太熟悉,你可以参考firefox和chrom怎么处理video标签的。


    Visual C++ MVP

    2014年7月13日 13:18
    版主