c# - 如何窃取另一个应用程序的视频(通过 hwnd)并在单独的应用程序中显示

标签 c# video video-capture hwnd

我想获取 Skype 的视频并将其插入到我自己的应用程序中。我正在使用 skype4com 来控制调用,但我找不到任何引用或示例来建议获取其视频流以将其嵌入到您的应用程序中的工具。我试图加入 SkypeKit 计划,但一个月后我仍在等待他们的任何消息,而且我听说你经常等待,等待他们的消息。

我想知道是否还有其他我可以做的事情,比如找到 Skype 正在显示的视频的 hwnd 并将其用于面板/表单/等中/用于面板/表单/等。我在我的应用程序中拥有的,然后隐藏 Skype 窗口的其余部分。我尝试使用谷歌搜索一般主题,但也许我不知道该概念的正确描述导致我找不到任何东西。

粗略地说,我知道我可以做一些事情,比如使用窗口句柄来抓取框架的位图并将其显示在我自己的应用程序中,隐藏 Skype,但这可能会产生很多开销。

任何人都知道如何做到这一点或这代表什么概念,以便我可以自己找到它?

谢谢!

最佳答案

这不是问题的最终或完整答案,但它包含对我提出的问题的部分答案......

我最终尝试了各种事情并取得了不同程度的成功。

解决这类问题的第一个问题显然是确定您尝试重新调整用途的视频是否通过 DirectX 呈现。

如果视频不是 DirectX 渲染的,那么您确实可以从窗口捕获视频并在任何您喜欢的地方实时播放。网络上有各种示例,告诉您如何从窗口捕获位图。诀窍是 Window 可以通过不透明度不可见但不能最小化(最小化它不会更新)!您只需使用找到的具有视频的窗口的 hwnd,并在循环中通过各种方法获取这些位图的副本,然后在其他地方显示它们。根据您计算机的速度和视频的大小,此方法可以正常工作,我没有遇到任何问题。

如果您试图劫持的视频是通过 DirectX 呈现的,那么您大部分情况下(但不完全是)运气不好。由于 DirectX 视频由显卡(而非操作系统)直接渲染到操作系统表面,因此您必须使用完全不同的方法将视频抓取为帧并在其他地方显示。有各种关于如何进行 DirectX 屏幕捕获的示例。但是,最大的问题是,如果 DirectX 窗口被隐藏、重叠或将其不透明度设置为零,您将无法捕获任何内容!我什至尝试使用虚拟桌面管理器软件来查看是否可以欺骗系统在虚拟窗口中播放 DirectX 视频,然后捕获它以在我想要的地方播放,但当然它比我聪明而且我得到了一个空白图像。所以,底线似乎是除非你做一些非常极端的事情,比如写一个虚拟显卡驱动程序,否则你就不走运了。 (有多种有趣的方法涉及编写 DirectX 代理,这些代理可以在传输到显卡的途中捕获视频/静止图像,但我仍然认为您可能需要一个虚拟图形驱动程序来说服它显示表面是可见的,因此值得渲染。)

关于c# - 如何窃取另一个应用程序的视频(通过 hwnd)并在单独的应用程序中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189234/

相关文章:

c# - Hololens - 访问相机框架

c# - 获取 .NET WEB 应用程序文件系统根目录的通用方法

c# - 如何连接 Datagridview 行值并将其存储到一个数据表单元格中

c# - 尝试安装 Windows 服务 - 此代码有什么问题?

image - 将多个图像保存为视频格式的可能性?

opengl - 在视频中捕获 openGL 图形

c# - 为什么这个正则表达式模式会导致解析器在给定某些输入时挂起?

android - Chrome数据压缩和文件上传

安卓视频播放器问题

java - 如何通过在android或java中捕获动画 View 来制作视频文件?