Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的视频通话#_C#_Wpf_Silverlight_Streaming_Directshow - Fatal编程技术网

C# c语言中的视频通话#

C# c语言中的视频通话#,c#,wpf,silverlight,streaming,directshow,C#,Wpf,Silverlight,Streaming,Directshow,我想做一个类似于Skype的应用程序,主要问题是如何处理视频和音频。第一个问题是如何获取视频的字节数组(具体来说,我需要获取表示视频的字节,以便我可以通过internet发送它们),音频也是如此。第二个问题是播放来自另一台计算机的字节。 我一直在考虑在WPF中这样做。我是WPF新手(我做了一些练习,并制作了几个程序,其中有一个基本的聊天程序)。我这样做是为了练习,我想尽可能地自己编写代码,服务器、客户端、数据传输等等。。。 我一直在互联网上搜索,在我看来,只有一个解决方案是好的,或者说是可行的,

我想做一个类似于Skype的应用程序,主要问题是如何处理视频和音频。第一个问题是如何获取视频的字节数组(具体来说,我需要获取表示视频的字节,以便我可以通过internet发送它们),音频也是如此。第二个问题是播放来自另一台计算机的字节。 我一直在考虑在WPF中这样做。我是WPF新手(我做了一些练习,并制作了几个程序,其中有一个基本的聊天程序)。我这样做是为了练习,我想尽可能地自己编写代码,服务器、客户端、数据传输等等。。。 我一直在互联网上搜索,在我看来,只有一个解决方案是好的,或者说是可行的,那就是使用DirectShow

另外,我知道Silverlight支持摄像头和麦克风,我也尝试过(实际上,我尝试过在WPF项目中使用Silverlight项目托管一个HTML页面,其中包含webbrowser控件,并且我成功地从我的网络摄像头显示视频),但我不知道如何获取表示视频的字节

这可能与WPF或silverlight有关吗?
如果您能提出任何解决方案、建议或有用的链接,我将不胜感激

我不能和WPF或Silverlight说话,但我在DirectShow中这样做过,这让我很痛苦。 如果你想使用.NET,有一个名为DirectShow.NET的开源包装器,这很有帮助,但它仍然是个麻烦

微软在DirectShow和整个过滤图方面做得很好,但不久前他们有点失手了,多年来都没有更新过


我建议您寻找一种不同的技术(尽管它可能位于DirectShow上),我很想听听您的发现。

使用DirectShow过滤图,您可以从输入设备(如照相机和麦克风)直接访问图像和音频缓冲区,如字节数组,逐个样本。您将能够直接操作数据,选择编码或压缩格式(使用特定的过滤器),并控制数据速率和同步

然而:

  • 如果你对这种环境完全陌生,那就很难了。而且,我知道它与C++很好地工作,但是我从来没有在C语言中编码任何DirectShow应用程序。(您可能希望这样看:、MSDN DirectShow主题和使用graphedit的测试)

  • 流媒体通过网络访问并通过Directshow接收流媒体并不是一件小事,也可能是一件非常痛苦的事情。网络渲染器和网络源过滤器随处可见,但在我看来总是很难使用。根据您的视频格式(H264、MPEG、MJPEG…)和网络协议(RTSP、纯旧简单UDP…)选择,您可能最终不得不编写自己的流/源过滤器,这既困难又耗时

然而,这是可行的,如果您的主要目标是实践编码,那么为什么不呢


(从未使用过WPF,也许它实际上更简单!)

对于所有对此主题感兴趣的人

在花了好几个小时在互联网上搜索之后,我终于找到了一个可行的解决方案。使用Silverlight,我将捕获的图像大小调整为160x120(或更小),然后使用imagetools进行转换。一个负责拍照的线程开始捕获,当它完成时(捕获是异步的,所以需要使用信号量),它会休眠200毫秒;这几乎相当于每秒5帧。我这么做是因为我上传的带宽很慢,大约每秒16千字节,所以我必须尽可能多地压缩一帧。结果是低细节的图片,但若你们使用100x100的矩形来查看它,那个也不算太糟糕。我还没有在互联网上尝试过,但是,正如我所说的,它应该会起作用。我也尝试过使用压缩方法,如果可能的话,将图片再压缩一点,但我不知道如何使用该类(有些东西工作不太好),所以将其留待下次使用。现在我只想让它发挥作用,然后我会努力提高性能。 哦,还有一件事,我还必须解决音频传输的问题,这需要很多工作。
所以,请听后面的话。

也许会给你一些有用的信息:“谢谢你的回答,我会尝试一下:”我也建议看一下MS的媒体基金会,因为它似乎是Directshow未来的“替代品”。我一直在阅读媒体基金会,我必须说它看起来很有前途,但它有一个主要的缺点:它只在Vista和更高版本上运行,不支持XP。因为很多人仍在使用XP,我担心我不得不跳过这项技术(我想尝试让程序也适用于XP,当然如果我能做到的话),谢谢你的回答。我听说过那个包装纸。你能给我解释一下DirectShow.NET和DirectShow之间的区别吗(我知道我可以用谷歌搜索它,但我想听听你的意见,基于你在这方面的经验:)正如我提到的,我还是个学生,所以我会尽我的时间做这件事。但是,如果我成功地做到了这一点,我会在这里发帖(如果我没有做到,你无论如何都会知道:)。嗯,基本上是一样的。如果您是.NET新手,他们称之为COM互操作包装器。这基本上意味着你调用C++方法1-1,但是从.NET调用。当然,它们使用了很多奇怪的结构,你必须在你的C代码中复制这些结构。否则,就像C++一样,很多奇怪的对象和toks.实际上,我完全忘记了:这是一个更好的包装库。上一次我用它做网络摄像头,理论上它就像DirectShow.NET,但从C#开始使用起来更容易。