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

c#实现p2p的流媒体视频系统,求方法(用tcp)或者源码
因为要做一个东西,需要这方面的东西 
现在的初步设计是用tcp或者udp协议来传输,可是看书上大部分都是说得普通的文本传输 
1.首先流媒体的传输需要把一个把媒体文件变成二进制的过程,然后传到接受端要变回媒体文件,这如何实现? 
2.传输的媒体文件是分成固定大小的包的,而且要能对包进行定位,比如一个接收端需要哪个时间的文件,就请求。我的问题是怎么进行这种包的控制,如何进行打包。 

我的方案可能有不成熟的地方希望大家能提出来,或者有什么更佳的实现方法更好,能提供源码就更好了。100分是下限,只要大家能给我有益的东西就会给分,给完为止,希望不要复制粘贴那样回答

------解决方案--------------------

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

------解决方案--------------------
传数据和文件一样,对文件分块传输,关键是用UDP传文件时考虑数据流字节的大小和丢包重发.
C# code
  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);
                        }

------解决方案--------------------
http://download.csdn.net/source/635565
http://download.csdn.net/source/820806
http://www.cnblogs.com/evernory/articles/22178.aspx
------解决方案--------------------
这样的问题对于我这样的新手实在是太难了.

不过我手里的一本书 <<C# 高级编程>> (第六版)

第47章 是讲解P2P 对等网络的 讲的还算详细

新手,还看不懂.
------解决方案--------------------
首先,我不太清楚你要实现的是个什么东东,但是无非就是视频与音频数据的传输.现在假使有终端A和B.

1.首先流媒体的传输需要把一个把媒体文件变成二进制的过程,然后传到接受端要变回媒体文件,这如何实现? 

答:编码与解码.A和B之间建立连接之后,通常是在二者之间开一条RTP通道,数据是通过这个RTP通道实现P2P方式传递的.
以音频传递为例,视频同理.A端捕获到数据之后进行编码,例如对音频可以使用G711编码方式编码.编码之后通过RTP通道传递数据到B端指定的端口,B端有个监听的机制,用来监听这个端口,当收到数据之后进行解码,解码之后播放.

2.传输的媒体文件是分成固定大小的包的,而且要能对包进行定位,比如一个接收端需要哪个时间的文件,就请求。我的问题是怎么进行这种包的控制,如何进行打包。

答:包的大小是根据你选择的编码方式来决定的,不同的编码方式应该选择不同的包大小.对数据包的控制通常使用协议栈控制,其实就是RTP协议,可以使用开源的协议栈:ortp或jrtp.时间的控制是通过时间戳控制的.最好熟悉一下RTP/RTCP协议.

另外,如果你的软件不大,要求不高,可以自己定义协议,数据的封包也可以自己定义,包括包头和数据部分,具体根据实际情况.
如果你的软件对控制要求比较高,这个时候就要考虑自己写一个协议栈或者使用开源的协议栈了,例如可以使用sip协议信令进行控制. SDP协议描述媒体以及协商媒体.