视频流在局域网传输遇到的问题!(VideoCap , Wsocket , onVideoStream)(100分)

  • 主题发起人 主题发起人 tuday
  • 开始时间 开始时间
T

tuday

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟在做个类视频电话的时候遇到这样个不解的问题,请各路高手帮忙!
我用到了VideoCap 控件(其实可以不用,用它的效果似乎不怎么好,打算用它实现功能之后再处理)
ics。 在videocap 中有个事件是onVideoStream(大概是 WM_CAP_SET_CALLBACK_VIDEOSTREAM触发的)
现在我用videpcap里自带的deom3 修改了点。代码是这样的:

procedure TMainForm.Video1VideoStream(sender: TObject;
lpVhdr: PVIDEOHDR);
begin

try
// Showmessage('On');
WSocket1.Send(lpVhdr^.lpData, lpvhdr^.dwBufferLength);
except
//
end;

inc(Counter);
// Counter 已初始化为0 的全局变量
Edit1.Clear;
Edit1.Text := inttostr(Counter);
edit2.Clear;
Edit2.Text := inttostr(lpvhdr^.dwBufferLength);
……
end;

运行
发现 edit1里counter的不断增加
发现 edit2里的lpvhdr^.dwBufferLength 没有变化
但是,
用于接受wsocket1发出数据的wsocket2没有收到数据的响音!
天网拦截是数据显示发出的数据和接收数据都有,但是发送比接收要多1个数量级!
不知道为何?
Socket是这样初始化的:
begin

WSocket1.Proto := 'tcp';
WSocket1.Port := '4679';
WSocket1.Addr := '127.0.0.1';

WSocket2.Proto := 'tcp';
WSocket2.Port := '4679';
WSocket2.Addr := '127.0.0.1';
WSocket2.Listen;

WSocket1.Connect;
end;


另外,远一点,假如收、发都正常了,怎么样还原图象,以及avi-》mpeg4的问题,
谁能具体解释一下onVideoStream的触发条件?
再要个例子是不是太心大:)
问题很多,各路大虾帮忙啊!
tuday@263.net
 
怎么没有回音啊!
 
关于onVideoStream,建议你看看MSDN,里面解释的非常清楚
关于发送和接受数据不一致的问题,猜想是数据发送太频繁,数据块太大
其实音视频数据实时传输一般用RTP,而不用TCP的
关于样还原图象,以及avi-》mpeg4的问题,呵呵,够写本书了

如果实在要做这个东西的话,建议你用现成的控件吧
 
这么难度很大.不是一个帖子就可以讲出来的.建议你多看看资料吧.不要想一口气吃成胖子.
网络的传输你要看看
avi部分也就是VFW文档也要看.
看完了VFW的话就可以会压缩成Mpeg4了.
如果用directshow的话还要看他的文档. 呵呵. 很麻烦的哦.
 
我见过一个很简陋的方法,就是把捕抓到的视频写到图片那里,实时传送这个图片就行了
 
to dd: 多谢!关于数据接受和发送不一致的确是因为发送过于频繁,数据包大的原因。可是现在
对应出来的问题就是怎样快速正确地发送和接受数据(当然是要压缩之后,avi太大了)。
不知道你说的RTP是不是要基于c/s的。我现在做的东西是点对点的。rtp我还没接触过(其实
我就是个新手了),这就找点资料看看。
如果用现成的控件,VideoCap,还有什么呢?
to Xwings: directshow是directx的一部分是么?找了一下这个关键字出来的资料,好象跟游戏
很相关,但是也没找到实时传输的例子,请多指导。
to lwaif: 我做过远程屏幕监视的东西,觉得要是做成图片的形式的话,图象质量很差。而且也会遇到
传输数据量大的问题……

知道这样的问题不好说清楚
还请各路高手费心赐教哦!
急需!
 
[8D]

这个自己带压缩:
http://www.banasoft.net/AVPhone.htm

procedure TForm1.VidCap1Frame(Sender: TObject;
var Data: OleVariant);
begin

{
After one video frame captured this event fired, and
Data is the compressed video data.

You may send it to remote:
SendData(TM_VIDEOFRAME, Data);

or write it to file:
AVIFile1.WriteVideo(Data);

or render it directly:
}
VidRnd1.Frame(Data);

end;
 
呵呵,再说几句吧,关于如何视频数据如何传输,首先,你要确定目标传输环境的
可保证速度和平均传输速度,基于这个速度确定你的视频流比特率,要是达不到就
采取以下方法解决:1采用更好的压缩算法,2降低图象分辨率,3降低祯速率
关于RTP,其实是一种基于UDP再封装的网络传输协议,包括RTP和RTCP,之所以
采用这个而不用TCP是因为音视频流是时延高敏感,对传输错误相对低敏感的
并且UDP协议的传输效率要明显高于TCP
如果想具体了解这些,建议你参看一个国际标准,好像是H.323吧,这是个协议
族,包含编码,传输的各方面
 
directshow目的是通过简单的编程控制实现可以播放采集传输多媒体音视频。 目前ms已经把它大大扩展了。
功能强大。 有很多组件可以使用的。 而且用directdraw方案采集图象的趋势已经超过使用VFW的了。
建议多媒体编程的DFW们多多学习和了解一下。
另外初期建议不要限于什么网络协议 。在局域网中测试用一般的UDP协议是没有什么问题的
H323也不好。太复杂了。没有具体的实现 。自己写更是不可能。
 
你在传输的时候使用的方法不对啊!
不能一次发送那么多数据. 应该分成小的包,比如每次8K,逐个包发送,
每个包之间加5到10ms的延时. That's OK!

请参考: http://www.avsuper.com
是delphi写的.
 
to Xwings : directshow 我正在从头开始,谢谢!
to caowei: http://www.avsuper.com是我近段时间访问最多的网站之一了。你说的很有道理
那样发送数据,一边发不了,另外一边也收不全。你说那种方法应该是用tcp是吗?
另外,压缩了之后再发是吗?拆包和压缩我都没做过呢。能给我点具体的提示吗?
我的email: tuday@263.net 先谢过了!

我现在就直接发缓冲区里的avi,在局于网里能勉强看到图象了:)方法虽然不对,但是这对我来说
很高兴了:)当然,这不是终点!
多谢继续关注!
 
楼上各位:
不好意思,我是tuday。不知为什么,tuday 这个用户名这两天登陆不了,不知道什么原因。
分数我肯定给的,各位放心好了。
谢谢!
 
后退
顶部