怎么样通过网络实时传输并播放VCD(AVI)呢?(67分)

  • 主题发起人 主题发起人 netwinds
  • 开始时间 开始时间
N

netwinds

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么样通过网络实时传输并播放VCD(AVI)呢?不是用共享方式,并且也实时传输语音
 
UDP广播方式
 
楼上的方式不错,其实和打开远程文件播放的原理应该有共同点。
 
怎麽操作呢?能不能給你源碼例孖看看?或給個資料?!
 
谁能提供效果较好的代码
我支持300分
 
AVI文件不是流格式文件,不能实现边传输边播放!
 
用广播?计算一下流量吧,一般都用组播的,还有就是avi不行,像楼上说的,AVI不是流
 
这个比较复杂,因为不论是用何种网络方式都牵涉到一定的数据压缩,因为直接传输AVI~~~~~~天啊!那数据流量将非常的大,即便是压缩如果算法不好还是一塌糊涂。而且如果你想像RM式的在线播放可能你需要重新写AVI播放程序,你知道的,不是流文件的话,如果文件不完整是不能放的!我劝你还是采用流文件吧,最多是将AVI转一下,至少我觉得这比写AVI的容易!
 
那不管AVI,找流文件来处理,要怎么处理呢?就象RM一样的功能。
 
清楚的帮助一下,不清楚的帮UP一下。谢谢
 
http://www.138soft.com
 
http://www.138soft.com/download/Mpeg1Decode.zip
 
这个不好用,试了,速度太慢。再求高级的算法,要实免实现多客户端的,点播与广播同时用上的。
 
高手呢?都哪去了?!
 
[軟件簡介]:在局域网实现多媒体信息广播,同时实现网络屏幕监视和远程控制等网络管理目的。专门针对电脑教学网络开发, 可以方便地完成电脑网络教学任务,包括广播教学、屏幕监视、远程控制、网上语音广播、两人对讲和多方讨论、VCD/MPEG/MP3/AVI/WAV/MOV等视频流的网络广播、黑屏肃静、联机讨论、远程命令、电子教鞭、 电子举手、锁定学生机的键盘和鼠标、远程重启和关机、班级管理等。
界面:http://www.peggyli888.com/UploadFile/2003101810132849344.gif
論壇:http://www.peggyli888.com/dispbbs.asp?boardid=18&id=1984&star=1#1984
 
上面这个就是四海教室改过来的嘛.我的朋友翁守海写的,基于文件共享的.我的会员代码里面也有啊.
http://www.138soft.com/bbs/list.asp?boardid=10
原理比较简单:http://www.138soft.com/tips/mediaplay.htm
缺点是:一放VCD光盘马上出问题.

这三个才是基于流的:http://www.138soft.com/tips/mpeg1stream.htm
http://www.138soft.com/download/Mpeg1Decode.zip
http://www.138soft.com/download/VodDemo.zip
http://www.138soft.com/download/httpvod.zip
 
都是DEMO,有没有源码?给参考一下嘛,都是穷苦人民
 
楼上的不行,同时十五个客户端点播就出问题了,有没有新的高手/????
 
来自: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方式.只要你可以实现把数据包解码,那么其它一切好说.
至于播放速度与支持人数,那就完全取决于你如何平衡数据.
只要你及时送足够数量的数据包进去,那么绝对是没问题的.
所以这实际上是两个问题.
 
后退
顶部