我的目的有两个:
1、电脑A从C盘读入一个1G bytes的AVI视频文件,本地播放的同时要通过网口实时传给电脑B。
2、电脑B接收到AVI视频数据后要能实时播放。
也就是基于局域网的一台电脑边播放AVI边传输,另一台边接收边播放。该AVI视频为720*576的8bits的黑白视频。一帧的大小为405K。
我的做法:
1、Server端创建两个socket,用的是csocket,一个是TCP的socket,用于接收“开始”标记,我用0xff做为标记。另一个是UDP的socket,用于发送一帧的视频数据,大小为405K bytes。
2、client端也创建同样的两个socket.用于发送“开始”标记和接收视频数据。
3、过程如下
server:
  listen()---accept()--receve(),如果接收到的为“开始”标记,即0xff,就读入一帧AVI视频数据到缓冲区,用CDC画出来,然后用UDP发送给Client端。把每帧拆成405个1K的包来发送。发完一帧后等CLIENT端发0XFF,接着发第二帧。
client:
  connect()成功后,send()发送0xff,然后开始接收一帧视频数据到缓冲区,接完一帧后用CDC画出来。最后再发0xff给server端告诉它继续发第二帧。
这样做的问题:
1、两端播放的时候都很卡,而且很容易死在那不动。
2、显示的画面不完整。
请问:1、基于socket有什么更好的解决方案吗?
      2、我的做法出现问题的原因是什么呢?
      3、有没有可能是发送的速度过快,网络没来的及处理呢?还是发送与接收端没有处理好   时序关系?希望高人指教!

解决方案 »

  1.   

    哪儿还用自己非这么大劲些什么程序。直接用microsoft Windows Media Encoder +Windows Media Player就成了。
    你的AVI也不压缩,数据量太大,CDC自己绘制效率也不会高不到哪儿去。如果要自己写就用TCP好了,速度没你想象的那么差劲。
      

  2.   

    是啊。要压缩一下。也可以用RTP/RTCP协议来作。microsoft Windows Media Encoder +Windows Media Player好像很猛,虽然没用过,据说有好几秒的延时。
      

  3.   


    楼主可以采有 UDP的传输方式, TCP一定不行, 太慢了. 结合RTP 和 RTCP 对包进行有效控制.这样就可以你的问题了.
      

  4.   

    directshow
    CDC利用cpu的计算能力,而directshow则利用显卡的计算能力
    而且,现在显卡的速度比cpu快多了