来自:netwinds, 时间:2003-10-17 9:01:00, ID:2235557
这个不好用,试了,速度太慢。再求高级的算法,要实免实现多客户端的,点播与广播同时用上的。
---------------------------------------------------------------------
速度慢是因为我每次只组播2324个字节的数据包而已.实际应用中应该根据网络速度来处理的.如果你不处理网络速度,那么每次发送32KB好了,这样一来绝对不会卡的.因为这个是属于组播,即使你有1万台电脑接收也与读文件无关的.读文件的只有你一台电脑而已.
const
DatFramSize=2352;//Dat文件每个包大小
MpgFramSize=2324;//Mpg文件每个包大小
procedure TSendStreamThread.InitVedioConfig;
VAR
t:linger;
//var BroadCast:Bool;//注意:必须为Bool或者Integer,不能为Boolean,否则在Win9X下无法工作!
begin
PlayBuf:=GetMemory(MpegFrameSize);//分配读文件块要保存的内存
SendBuf:=GetMemory(VideoPackSize); //分配向网络发包的内存
FSocket:=Socket(AF_INET,SOCK_DGRAM,0); //初始化socket
if FSocket = SOCKET_ERROR then MessageBox(0,'Socket() Failed',MpgServerName,MB_ICONERROR);
{ BroadCast:=True;
if setsockopt(FSocket,SOL_SOCKET,SO_BROADCAST, @BroadCast,sizeof(BroadCast))=SOCKET_ERROR
then MessageBox(0,'set sock option failed',MpgServerName,MB_ICONERROR); }
mreq.imr_multiaddr.S_addr := inet_addr(TMulticastIp[iMulticastGroup]);//htonl(INADDR_ALLHOSTS_GROUP);
mreq.imr_interface.S_addr := htonl(INADDR_ANY);
if setsockopt(FSocket,IPPROTO_IP,IP_ADD_MEMBERSHIP,pchar(@mreq),sizeof(mreq)) = SOCKET_ERROR then
begin
//MessageBox(0,'无法进行UDP组播','',0);
end;
...
procedure TSendStreamThread.Execute;
.....
CopyMemory(@VideoParkFrame[5],PlayBuf,MpegFrameSize);//复制内存PlayBuf->VideoParkFrame
CopyMemory(SendBuf,@VideoParkFrame,VideoPackSize);
SendBytes:=Mpeg1Decode_SendBuf(PlayBuf,MpegFrameSize);//发送数据到本地视屏缓冲区
Sendto(FSocket,SendBuf^,VideoPackSize,0,addr_to,sizeof(addr_to));//组播
--------------------------------------------------------------
来自:netwinds, 时间:2003-10-21 11:15:00, ID:2243175
楼上的不行,同时十五个客户端点播就出问题了,
------------------------------------
点播的话你必须自己处理网络平衡,否则是很麻烦的.因为比如说你15个用户点播,如果是点同一个文件,那么你服务端得开15个线程来同时读一个文件.所以点播的话必须自己处理文件数据的读写.否则与共享的方式是没有区别的.
procedure TFrmMain.SendVideoFileProcess(AThread: TIdPeerThread;const StrFileName:String;const iPosStart,iPosStop:integer);
var
TempBuf:array[0..10240*4-1]of byte;//每次发送4KB数据.适用于INTENET传输.宽带可以增大.
..
begin
..
iRead:=FileReadStream.Read(TempBuf,Sizeof(TempBuf));
AThread.Connection.WriteBuffer(TempBuf,iRead);
...
或者每次适当增加发送的包数据.
关于广播,组播或者点播:
实际上,他们的核心问题是解码问题.也就是如何把文件数据还原为视频和音频.我们这里不讨论硬解压,因为那个太简单,只要把数据包往卡里面塞即可.象神龙卡之类,特别是神龙卡支持的MCI方式.只要你可以实现把数据包解码,那么其它一切好说.
至于播放速度与支持人数,那就完全取决于你如何平衡数据.
只要你及时送足够数量的数据包进去,那么绝对是没问题的.
所以这实际上是两个问题.