最近有一个项目,需要视频传输,我对此不很熟悉,请教各位高手。
在网上看到一些,视频传输的一些例子是用UDP协议的。为什么不用TCP协议呢,另外有看到一些关也IOCP的介绍是使用TCP协议的,到底哪个方案好些。
另外用directx show是不是本身就能可以实现视频传输,性能如何?

解决方案 »

  1.   

    另外用directx show是不是本身就能可以实现视频传输,性能如何?
    directshow本身并不涉及网络传输,不过可以参考dsnetwork示例(一个filter而已)至于UDP还是TCP,其实都不是问题。UDP需要考虑丢包和包乱序的问题, TCP不用考虑这些,但效率可能略低(不过得看UDP实现代码的质量了)。
      

  2.   

    使用TCP时是不是都是搭配IOCP一起的呢?有没有TCP+IOCP的例子?
      

  3.   

    使用TCP并不一定要使用IOCP,select, WSAAsyncSelect, WSAEventSelect, Overlapped I/O等其它IO模型均可。www.codeproject.com/internet
      

  4.   

    select这些模型以前还是比较熟悉,只不过考虑到视频传输的时候的效率问题是不是IOCP会比较好?
      

  5.   

    那建议用UDP,视频传输一般要求速度~~~
    你还可以用DirectShow,也可以用底层的Wave相关的API来实现~~~
      

  6.   

    网上应该有好多关于DirectShow和Wave方面的例子可以参考~~~
      

  7.   

    RTP/RTCP
    见rfc1880, rfc3550
      

  8.   

    视频数据都是数据量很大的,25帧每秒CIF的视频大约要56Mbps,所以要利用传输效率高的UDP协议!
      

  9.   

    相信我用UDP没错的,因为我前些时间也有同样的开发,做了很多试验,用TCP的致命缺陷是它的“加性增乘性减”特性,这会使得即使很小的丢包也会大大降低速度,而且TCP是不丢包的,如果视频数据量大于网络速度,那会在发送端越聚越多最后造成系统崩溃。视频传送使用UDP即使丢一两个帧也是无关紧要的
      

  10.   

    我最近做的项目发现测试的时候丢包30%左右,现在发现QoS很难控制啊,那些RTP/RTCP好像理论性较强,实现起来好像比较复杂,有没有什么实现可以参考一下呢?
      

  11.   

    我最近做的项目发现测试的时候丢包30%左右,现在发现QoS很难控制啊,那些RTP/RTCP好像理论性较强,实现起来好像比较复杂,有没有什么实现可以参考一下呢?======================================================手工分片,片长控制在1500以内
      

  12.   

    楼上25帧每秒CIF的视频大约要56Mbp是怎么算出来的?用mpeg4压以后呢?
    另外请教一下用ICSeqCompressFrame压以后的数据,是否直接存到文件里,其他的播放器就能播放吗?
      

  13.   

    CIF一个I帧是352*288像素,如果不压缩,每秒25帧,每个像素使用24位真彩的话占用3个字节,
    这样352*288*25*3~7M=56Mbps,
    用mpeg4压缩率相对比较大,但也要根据各帧间图像变化幅度来压缩,所以压缩后的码流是不固定的。
      

  14.   

    你写文件时要按照文件的组织格式来写啦,例如AVI文件的话它有自己的格式,你要按照它的格式写进去。
    然后播放器需要有数据流解压缩的驱动程序。一般来说这样就可以播放了吧
      

  15.   

    avi文件格式通用吗?是否divx编码的avi格式会不同?
      

  16.   

    avi格式的网上找啊,很多的.
    avi格式是通用的啊,是遵循RIFF格式的文件
      

  17.   

    我的做法是在在capSetCallbackOnVideoStream的回调函数中用divx压缩数据,然后要把这些数据要存为AVI文件,请问这些数据应该如何存为AVI文件?我看过AVI的格式其中有两个结构体MainAVIHeader和AVIStreamHeader里面很多数据不知道怎么获得
    MainAVIHeader:
        DWORD  dwMicroSecPerFrame;   // 视频帧间隔时间(以毫秒为单位)
        DWORD  dwMaxBytesPerSec;     // 这个AVI文件的最大数据率
        DWORD  dwPaddingGranularity; // 数据填充的粒度
        DWORD  dwFlags;         // AVI文件的全局标记,比如是否含有索引块等
        DWORD  dwTotalFrames;   // 总帧数
        DWORD  dwInitialFrames; // 为交互格式指定初始帧数(非交互格式应该指定为0)
        DWORD  dwStreams;       // 本文件包含的流的个数
        DWORD  dwSuggestedBufferSize; // 建议读取本文件的缓存大小(应能容纳最大的块)
        
    AVIStreamHeader:
         DWORD  dwFlags;    // 标记:是否允许这个流输出?调色板是否变化?
         WORD   wPriority;  // 流的优先级(当有多个相同类型的流时优先级最高的为默认流)
         WORD   wLanguage;
         DWORD  dwInitialFrames; // 为交互格式指定初始帧数
         DWORD  dwScale;   // 这个流使用的时间尺度
         DWORD  dwRate;
         DWORD  dwStart;   // 流的开始时间
         DWORD  dwLength;  // 流的长度(单位与dwScale和dwRate的定义有关)
         DWORD  dwSuggestedBufferSize; // 读取这个流数据建议使用的缓存大小
         DWORD  dwQuality;    // 流数据的质量指标(0 ~ 10,000)