因为要做一个东西,需要这方面的东西 
现在的初步设计是用tcp或者udp协议来传输,可是看书上大部分都是说得普通的文本传输 
1.首先流媒体的传输需要把一个把媒体文件变成二进制的过程,然后传到接受端要变回媒体文件,这如何实现? 
2.传输的媒体文件是分成固定大小的包的,而且要能对包进行定位,比如一个接收端需要哪个时间的文件,就请求。我的问题是怎么进行这种包的控制,如何进行打包。 我的方案可能有不成熟的地方希望大家能提出来,或者有什么更佳的实现方法更好,能提供源码就更好了。100分是下限,只要大家能给我有益的东西就会给分,给完为止,希望不要复制粘贴那样回答

解决方案 »

  1.   

    流媒体视频系统现在比较流行的应该有rtp,rtsp,mms这类传输协议
      

  2.   


    用Visual C#实现P2P应用程序
    http://download.csdn.net/down/607991/dailiec
    C#实现P2P应用程序
    http://hi.baidu.com/27136/blog/item/d9cc6d09f8d249216a60fbef.html
      

  3.   

    谢谢楼上的回答,用tcp做简单的p2p消息传递我明白流程,就是流媒体的传递以及播放会涉及到很多其他的问题,等待大人解答
      

  4.   

    传数据和文件一样,对文件分块传输,关键是用UDP传文件时考虑数据流字节的大小和丢包重发.
        FileStreamPacket fsp = packet as FileStreamPacket;
                            System.IO.FileStream fs = new System.IO.FileStream(fsp.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, FileShare.Read);                        fsp.SeqID = 0;
                            fsp.SeqCount = (int)System.Math.Ceiling(fs.Length / (decimal)MAXBUFFERSIZE);
                            fsp.PacketID= fsp.GetHashCode();                        long pos = 0;
                            long count = fs.Length < MAXBUFFERSIZE ? fs.Length : MAXBUFFERSIZE;                       
                            while (pos < fs.Length && count>0)
                            {
                                byte[] buffer = new byte[count];
                                fs.Seek(pos, SeekOrigin.Begin);
                                fs.Read(buffer, 0, (int)count);
                              
                                pos += count;
                                count = pos + MAXBUFFERSIZE < fs.Length ? MAXBUFFERSIZE : fs.Length - pos - 1;                                                      //数据包重组
                                    fsp.SeqID = fsp.SeqID + 1;
                                fsp.Message = Convert.ToBase64String(buffer);                            //发送数据
                                    byte[] buf = UtilityHelper.Serialize(fsp);                          
                                client.Send(buf, buf.Length, toUser.P2PAddress);
                                Thread.Sleep(300);
                            }数据包重发参考Lumn.Net
      

  5.   

    那数据传输到接收端以后的播放呢,直接用c#的meida player 是不肯能实现了吧,那如果自己再写个播放器岂不是很麻烦?
      

  6.   

    http://download.csdn.net/source/635565
    http://download.csdn.net/source/820806
    http://www.cnblogs.com/evernory/articles/22178.aspx
      

  7.   

    这样的问题对于我这样的新手实在是太难了.不过我手里的一本书 <<C# 高级编程>> (第六版)第47章 是讲解P2P 对等网络的 讲的还算详细新手,还看不懂.
      

  8.   

    没搞过
    你可以搜搜
    去cnlogs.com
      

  9.   

    首先,我不太清楚你要实现的是个什么东东,但是无非就是视频与音频数据的传输.现在假使有终端A和B.1.首先流媒体的传输需要把一个把媒体文件变成二进制的过程,然后传到接受端要变回媒体文件,这如何实现? 答:编码与解码.A和B之间建立连接之后,通常是在二者之间开一条RTP通道,数据是通过这个RTP通道实现P2P方式传递的.
    以音频传递为例,视频同理.A端捕获到数据之后进行编码,例如对音频可以使用G711编码方式编码.编码之后通过RTP通道传递数据到B端指定的端口,B端有个监听的机制,用来监听这个端口,当收到数据之后进行解码,解码之后播放.2.传输的媒体文件是分成固定大小的包的,而且要能对包进行定位,比如一个接收端需要哪个时间的文件,就请求。我的问题是怎么进行这种包的控制,如何进行打包。答:包的大小是根据你选择的编码方式来决定的,不同的编码方式应该选择不同的包大小.对数据包的控制通常使用协议栈控制,其实就是RTP协议,可以使用开源的协议栈:ortp或jrtp.时间的控制是通过时间戳控制的.最好熟悉一下RTP/RTCP协议.另外,如果你的软件不大,要求不高,可以自己定义协议,数据的封包也可以自己定义,包括包头和数据部分,具体根据实际情况.
    如果你的软件对控制要求比较高,这个时候就要考虑自己写一个协议栈或者使用开源的协议栈了,例如可以使用sip协议信令进行控制. SDP协议描述媒体以及协商媒体.
      

  10.   

    那我可不可以这样实现,有一个mms流,然后我catch它的数据,储存在硬盘里,然后播放,同时也可以转发,我觉得这也可以实现p2p的功能
      

  11.   

    http://hi.baidu.com/denglinglong/blog/item/49cb401e0233edf01bd57653.html