做了个屏幕广播,使用API函数bitblt截图
但是广播视频的时候必须要把硬件加速关掉。。
很不爽
请问大家,能不能提供一些截视频的方法,用C#实现。本人知道directx好像可以截图,但是找不到源代码,谁能提供以下?还有就是  bitblt虽然费cpu 但是速度还是可以的不知道directx 速度跟bitblt哪个快?

解决方案 »

  1.   

    用media play server可以实现还是高清速度也很好
      

  2.   

    DX  实际上楼主用的DriextDarw吧DX和bitblt比速度。。 要看实际情况了。
    先说播放和现实,比如你处理的是经过某标准压缩的高清图像,那在程序设计很合理的情况下DX快
    如果仅是低速视频,其实DX是大材小用了。
    DX可以截图 但是截图的时候速度还是慢,因为数据从内存,经CPU 总线 到达显卡、声卡等硬件设备后,DX才可以使用硬件加速。 在这之前DX只是个接口。
    为啥一般DX程序 常规抓图软件无法抓取?以为图像根本不在内存里。 DX是操作硬件(一般是显示硬件)中数据的。 也就是说DX的指令,告诉显卡 给我再XX坐标画一个圆,红色,半径YY,线条ZZ。  显卡只回报一个,OK我画了。 但是实际画的怎么样,图形如何,CPU和内存根本不关心,数据并不会送回内存的。 
    DX抓图是个效率很低的过程。因为要把显卡的工作流程反过来,从显存 经GPU, 回写给总线,然后才到内存。 这时候才可以转换数据,保存图像。我觉得楼主似乎应该分开实现, 屏幕广播 你是这样定义的。但是真正屏幕上的东西太多了,你应该按窗口处理。  比如你要广播的是桌面(桌面本身就是个窗口哦),就不要考虑啥DX了。直接通系统的抓取就可以了。  如果要抓取视频播放软件等窗口,通过DX去抓也OK。在监控端, 所有的图像都可以通过DX方式显示。
    以上只是大概的一个思路,实际上要实现还是很困难。
    你说一要截视频,通过DX。 这个其实很难。 不同的播放软件都不一样,你要处理的难度很大的。
    另外有个办法,就是监控显存。 所有的DX程序和系统显示都必须有一步是 更新显示缓冲。 你把对应的显存中这部分数据实时回发也可以(效率不会太高,只要量不太大还可以)。
    我觉得这东西最好分开对待,  你现有的屏幕广播已经不错了。  如果要视频的话,我都不建议你去抓图然后传送。网络效率也太低了的。
    对视频 建议你另起一个流媒体方式吧。
      

  3.   

    截视频的想法就不好  现在除了多帧AVI  基本其他食品都是动态编码 这样抓的出来静态图片效果很差 而且经过你的广播 到了监控端右丞了多帧AVI  数据提及巨大 清晰度有限
      

  4.   

    结贴
    打击很大、、、、不过俺不会放弃。。
    谢谢fengyecsdn