我需要开发一个程序,通过互联网将用户屏幕和声音传输给另一个用户。该场景可以这样显示:
他的电脑前有一位老师,并在他的电脑上写了一些代码(例如:visual studio)。他有一个麦克风。有两个学生在看老师的屏幕,用他们自己的电脑听他的声音。
有一些替代方法可以获取用户的屏幕截图,并通过c#(over udp)将其转换为ffmpeg,aforge或自编码屏幕捕获程序。尝试了所有替代方案。
然而,问题是它们都很慢,或者造成视频分辨率不佳。应该有另一种方式,因为有些程序达到了高质量。例如teamviewer,windows远程桌面,logmein可以发送高质量的屏幕。此外,teamviewer也可以发送声音。
我应该从哪里开始克服这个使命?哪个平台,语言,协议有用?
答案 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风格系统来添加音频通道