屏幕转移

时间:2013-12-09 00:53:11

标签: c# ffmpeg rdp

我需要开发一个程序,通过互联网将用户屏幕和声音传输给另一个用户。该场景可以这样显示:

他的电脑前有一位老师,并在他的电脑上写了一些代码(例如:visual studio)。他有一个麦克风。有两个学生在看老师的屏幕,用他们自己的电脑听他的声音。

有一些替代方法可以获取用户的屏幕截图,并通过c#(over udp)将其转换为ffmpeg,aforge或自编码屏幕捕获程序。尝试了所有替代方案。

然而,问题是它们都很慢,或者造成视频分辨率不佳。应该有另一种方式,因为有些程序达到了高质量。例如teamviewer,windows远程桌面,logmein可以发送高质量的屏幕。此外,teamviewer也可以发送声音。

我应该从哪里开始克服这个使命?哪个平台,语言,协议有用?

1 个答案:

答案 0 :(得分:2)

我知道这听起来很简单,但屏幕/桌面共享实际上是一个非常复杂的主题集合。不适合胆小的人:P

当然,已经专门为此类内容构建了many applications,其中包括BigBlueButton,这是为学术组织设计的。

你确定要重新发明轮子吗?

如果是这样......

屏幕共享有两种基本方法,一种是简单的,另一种是复杂的,实现起来要困难得多。

帧缓冲区复制

捕获屏幕图像并将其发送给客户端。正如您已经发现的那样,这可能是带宽密集型的,更不用说输出可能非常突然。

这是VNC和其他各种应用程序使用的方法。在VNC上已经做了很多工作以通过识别图像中的变化来加速该过程,并且仅发送那些已经改变的区域,使用VNC的不同化身使用的各种压缩方法来压缩增量图像。

您可以将C# implementation of VNC用于应用的视频部分。

VNC及其RFB(Remote Frame Buffer)协议的一个限制是它只是图形。然而,RFB是可扩展的,并且至少一个应用程序(QEMU)已经向协议添加了音频流。我建议使用你自己的音频扩展,而不是尝试实现QEMU,但是它不会进行压缩,因此音频流将需要大量的带宽来传输。

优势:易于实施。

缺点:高延迟,高带宽。

高级命令流

不是简单地传输屏幕图像(尽管它们通常也会这样做),一些更高级的协议会向客户端发送绘图命令流,从而在本地进行渲染。

这是RDP,X11和其他一些协议真正发挥作用的地方。产生这些变化的命令不会对正在显示的图像的变化作出反应,而是转发给客户端。

这个更难做,需要深入了解Windows处理绘图到屏幕的方式。可悲的是,我知道这种方法没有捷径可走。如果有一些方法可以获得当前桌面的RDP流并发送它,那就太好了,但到目前为止这是不可能的。

优势:低中等延迟,带宽减少。

缺点:难以实施,需要对操作系统的内部工作有广泛的了解。


除非您可以找到使用内置RDP堆栈实现目标的代码,否则您最好的选择可能是使用具有RFB protocol自定义扩展的VNC风格系统来添加音频通道