向高手请教:我编写的视频传输程序,在运行时客户端,老是出现花屏,请问是什么原因,有何解决的办法???(100分)

  • 主题发起人 主题发起人 小叶叶
  • 开始时间 开始时间

小叶叶

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手大哥,小弟编写了一个视频传输的程序,使用的是tcp控件编写的,用vfw获取
摄像头的视频数据,在内存中压缩成mpeg4数据发送到客户端,客户端解压后在显示出来,
程序没什么大问题,但是视频数据在客户端显示有些问题:开始不能在客户端显示正确的图
象,显示的是花屏,等到发送的有100多块时(缓冲区块),突然又变好了。小弟实在想不
出是什么问题,只好又在这里麻烦大家,
多谢各位不吝赐教: 多谢各位不吝赐教: 多谢各位不吝赐教: 多谢各位不吝赐教:
 
完全接受后再显示
 
谢谢这么快就有你的回音。
请问 你说得具体意思和做法?
请说详细些好吗?
 
数据不全导致图象不清晰?
 
有办法直接播放流中的内容?
 
[?][?]多谢各位
我按照你们说得再试试看,
还有再问一下谁有比较好的解决方法,
我得联系方式;yekh@sohu.com
哦,对了客户端接收的数据都是经过服务器端压缩的,客户端接收后解压,在画出来,
小弟就是想问一下,是否与压缩有关?是通过divx压缩的:还是因为我得电脑不行,听说
divx进行压缩和解压比较耗费资源,我得电脑主频失C466,内存128 :
还望各位高手指教![?]
 
表示关注。
传输的是mpeg4,客户端是 边解压边播放 吗??

楼主有QQ吗? 请留下!
 
你说的对
我得qq:110472010
莫非你有好办法?
 
原因一定是这样的:
mpeg4的压缩有帧内和帧间压缩。
在后一种方式下,要想解码得到正确的图象,必须知道它的前一帧画面数据。
分析你的情况,应该是接收到的第一个画面不是帧内编码的数据,而是帧间编码的,
所以无法正常显示(花屏)。过了100多帧以后,正好有一个帧内编码,以后的
显示就对了。
解决办法:先接收,后发送,以确保能收到第一帧帧内编码的数据。
或者接收端启动以后通知发送端进行一次帧内编码。

呵呵...我说得够详细了吧?


 
上面的大哥说得很有道理(至少我是这样认为的),可是我不会使用要求vfw发送全祯数据
的命令,我连他是什么都不知道,请问如何解决? (诚心请教)
上面大哥所说的数据不全,我不清楚你说的是那方面的意思?对你意思的理解我有三种:视
频的数据压缩后数据有所丢失? 服务器端将数据发送到客户机端时数据有所丢失?还是指客
户机接收的压缩数据解压后有所丢失?就此三种想法我试啦试,对于压缩和解压,其内部我
无法观察,没办法验证。不过就我个人认为,应该不存在问题,(div应该不会出现这种问
题吧)、对于传输过程中的数据丢失,我跟踪进去看,要应该不存在此种问题,发出地数据
和接收的数据一摸一样,要不就是我得电脑慢了(在客户端进行图象显示时,压缩数据还没
有解压完成,所以显示的是花屏),这个问题困扰我多天一直无法解决?还是要麻烦各位高
手,希望各位能帮小弟我解决这个问题!
谢! 谢! 非常感谢!!!谢! 谢! 非常感谢!!!谢! 谢! 非常感谢!!!谢! 谢!
非常感谢!!!谢! 谢! 非常感谢!!!谢! 谢! 非常感谢!!!谢! 谢! 非常感谢!!!
 
设置一个关键帧
等收到关键帧后开始播放
 
to 天真
关键祯是如何设的,是hic.ikey的值是吗?
我试试看,非常感谢你的留言。
 
对于mpeg4的了解不是很多,不过我作过mpeg1的网络播放,你说的问题在很多同类的系统都
有存在,不清楚你的解码方式是用的哪一种,如果是用的DirectShow,主要的原因应该还是
数据量的不足,因为必须达到一定数据包数才能正确的解码显示出图象。
实时解码回放对CPU的资源消耗是非常大的,P3 800的CPU只要同时播放两路网络视频,就会
达到满负荷。
解决的方法是可以接收到一定量的数据以后再将播放画面显示出来,一百包的数据有2-3秒应该
足够了。
 
to watter
对于你的说法,我表示同意,但对于你提出的办法,似乎没有很好的解决这个问题,
因为第一我无法准确的判断什么时候的数据量够清晰的显示,当然可以用宁多勿缺的方
法,这样的话会造成很大的延迟,恐怕难以接受;第二如果等到接收到100多包数据再进
行显示,那么就此下去,岂不是图象每隔2-3秒才跳动一次,这种效果也太差啦,还不
如用jpeg抓屏。当然这是我得一些想法,不知道你的意思如何。
在这里还是要谢谢各位的光临,小弟在此有礼啦。
另外有两个问题想问一下:
1 谁知道qq和reallink的解决方案,看效果他们的还不错,谁知道的话不妨说出来共享一
下,让大家讨论一下。
2 vfw中的关键祯的含义?我有两种想法一种是:定义了关键祯以后系统每隔此定义的帧数
就传输一帧完整的图象。另一种是:此定义的关键祯,只是系统在获取视频数据时,到此
数目的帧数,就发一个完整的帧,以后就以系统默认得方式进行,也就是说这个数字只是
定义什么时候获取这个关键祯。这是我的一些想法,不知道那个是对的或者两个都不对,
还望高手指教。
非常感谢大家的参与,请继续讨论 非常感谢大家的参与,请继续讨论
非常感谢大家的参与,请继续讨论
非常感谢大家的参与,请继续讨论
 
to 小叶叶:
你误会了我的意思,“接收到一定量的数据以后再将播放画面显示”,只要在第一次播放的时候
满足初始数据量就可以了,正常播放以后,你只要将新接收到的数据送到播放缓冲区就可以
了,这样就可以连续播放了。
初始数据量的大小可以做一个测试,在mpeg1里,每个数据包的大小是一定的,2324个字节,
如果初始播放数据量是20*2324字节,那么可以建立20*2324的缓冲区,缓冲满了就开始播放,
后续数据继续填补到缓冲区里。
 
哦 明白你的意思啦
不过这样的程序,我没编过,后来的数据添加是从缓冲区的后面添加?还是重新从一个
新的缓冲区开始添加?
如果有例子就最好,谢谢。
我得联系方式:qq 110472010 email:yekh@sohu.com
多谢各位!多谢各位!多谢各位!多谢各位!多谢各位!多谢各位!多谢各位!
多谢各位!多谢各位!多谢各位!多谢各位!多谢各位!多谢各位!多谢各位!
多谢各位!
 
你前面的程序是怎么做的,说说你原来的处理流程。
 
好的
等等 我整理一下
 
我得程序是使用vfw进行获取视频数据的。
是根据
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1096430
修改而来的。告诉大家啦,那么大家去看看就知道啦,
我要把他的服务器和客户机两部分的程序合并,做成一个可以发送又可以接收的程序,
只要这部分解决,程序运行还行的话,就做成com服务器,提供接口,以便进行系统的
集成。
 
后退
顶部