日期:2014-05-18  浏览次数:21069 次

【急,要交项目了】类似于做QQ的视频聊天...求教原理
我自己做了QQ的视频聊天
这里跳过客户端和服务器的部分:
(就是我要跟令一个客户端进行视频聊天,我就发送我开放的端口给服务器,服务器那边得到我的Ip加上我开放的端口帮我转发给那个客户端,这步已经连接上了)

【请求视频】客户端1 (port)-> 服务器(请求用户的ip + port) -> 【被请求】客户端2

之后 客户端1(ip + port)开一个线程[函数:f()] <--> 客户端2(ip+port) 也开一个线程[函数: g()]

然后,让客户端1,先发图片过去
  private int flag = 0;

  void f()
  { 
  if(flag == 0)
  {
  把自己视频上的图片截图下来,序列化之后发给 客户端2
  flag = 1;
  }
  else
  {
  1.接受发来的图片,显示在pictureBox上
  2.把自己视频上的图片截图下来,序列化之后发给 客户端2
  }
  }
  客户端2,
  void g()
  { 
  1.接受到图片之后显示在picturebox上
  2.把自己视频上的图片截图下来,序列化之后发给 客户端2
  }

这样处理好像发送得很慢,超级卡,而且有的时候 甚至不能通讯..
序列化,接受包都没问题

问题就是好像这种模式不是视频聊天的模式

我是各自两边都开线程
然后 客户端1 这边先发图片, 客户端2接受到图片之后,再发一张给 客户端1, 客户端1接受到之后 再发一张给客户端2
这样一直下去

我很急。。。。请大家帮帮忙!马上要交项目了!
 

------解决方案--------------------
视频不会 只会发图片 但是 可以给你改进思路
1.图片格式,给定小格式的图片,你自己查下那个格式的图片小。
2.图片传输过来是否给内存流清理资源。
你看看能帮助你不
------解决方案--------------------
用udp发送,每100毫秒发送一张图片给对方(效率高的话可以考虑更短的发送时间),只要对方收到新图片就放到pictruebox!这只是我的一个思路,毕竟没做过视频聊天的。
------解决方案--------------------
晕死。

视频或者语音通讯,最关键的是开发编码、解码器,传送的是帧的差分信息而不是整个帧。

会点通讯不算什么技术。
------解决方案--------------------
楼上正解哈c#本来就封装得够完整了。这个并不算是技术。
------解决方案--------------------
探讨
引用:
楼上正解哈c#本来就封装得够完整了。这个并不算是技术。


....针对我的问题说话...至于其他的,技术不技术的...问题能解决再说!

------解决方案--------------------
你这有点QQ远程协助的味道了。哈哈。

视频聊天这种事情,三言两语很难说清,要想有人帮忙,估计得花银子了
------解决方案--------------------
让你知道自己的问题如果不算是一种对你的帮助的话,我想你也就一般地在北大青鸟毕业就行了,不要想“视频聊天”这种项目。我面试过好几个在3、4个月的培训班里做过这个项目的学生,比如说我问他们“加好友的流程是怎样的”,他们(甚至一位“组长”)竟然回答我说:“先在SQL Server数据库里查询出所有用户人员,放到Tree上显示,然后用户为好友打勾,然后将勾选的人保存到用户的好友表中做为好友”。我整个要吐了。为什么那样的培训班要聘请那样的只做过OA程序的人当老师却要坑爹学员说他会做IM呢?为什么?
------解决方案--------------------
视频聊天
远程控制
我都做不了
我只能做点
客户端发个hello
服务端回个world




------解决方案--------------------
没有现成的示例代码,只能简单说说了
1:用摄像头抓视频,DirectX.Capture 可以抓 , VFW的API也可以抓,还有一些非官方的封装类也可以抓视频数据. 具体代码可以去搜索,例子应该不少
2:将数据转化为流媒体并且压缩数据,传递给接收端,接受端最好设置一个循环缓冲区,设置两个指针,一个表示当前播放位置,一个表示当前存储位置,这样可以最大程度的保证播放的流畅性。
3:视频聊天通过服务器中转有点不太靠谱,使用的人越多,服务器负荷越重 最好还是点对点的方式,采用UDP协议,当然如果要支持不同局域网内的机器使用,需要涉及到打洞穿透路由的技术,网上去查很多这方面原理和代码