| CM 的个人资料猪猪的BLOG照片日志列表 | 帮助 |
|
2006/9/27 焦头烂额 冯导要做远程视频传输、播放的东西,真是个挑战,原以为搞定视频播放就OK的,结果还是难逃远程控制的问题,不知道要怎么做,找了两天的资料也没有什么眉目。只有一篇文章似乎有点靠谱,看完之后的感觉还是和没看前一样,更晕了。不过文章终究是好文章,粘出来留个纪念吧~
本文针对不同的局域网,提出一种通用的实时视频传输的解决方案。在使用Divx编解码的基础上,提出了从压缩、组帧、发送到接收、解压整个流程的思想,具体实施方案和VC++实现核心源代码以及传输控制策略,有效地保证了高质量的实时视频传输。 引言 在局域网内部实时传输视频已经得到广泛应用。现在用以传输视频的局域网大多数是有线局域网,因为有线局域网技术成熟,传输速度快,稳定性好。但是视频数据量大,有线网络也会出现工作不稳定,引起数据堵塞,时间久了会导致严重的延迟现象;如果工作的环境不固定,要求移动性,那么就要采用无线网络,如今无线网卡的工作随环境的变化而变得不稳定,这样会导致视频传输的质量大幅度下降,容易引起画面的重影、抖动、花屏等现象。本文针对不同的局域网,提出一种通用的实时视频传输的解决方案,使用VC++自封装的Windows VFW SDK软件开发包进行二次开发,通过Divx编解码,按照制定的传输策略,能够有效地解决由于网络的局部不稳定导致的视频图像重影、抖动、花屏等的问题。 局域网中实时视频传输存在的问题 为了在局域网上有效的、高质量的传输视频流,需要多种技术的支持,包括视频的压缩、编码技术,应用层质量控制技术等等。 网络的带宽是有限的,所以需要压缩传输视频图像,MPEG-4被广泛的应用于网络环境下的实时视频传输,因为MPEG-4具有:可以达到很高的压缩比;具有灵活的编码和解码复杂性;基于对象的编码方式,允许视频、音频对象的交互;具有很强的容错能力等优点。本文采用Divx编解码器对视频进行编码、压缩,实际上Divx=(视频)MPEG-4+(音频)MP3。 应用层质量控制技术现在采用的是RTP/RTCP协议,以确保视频流在网络中低时延、高质量地传输。RTP数据传输协议负责音视频数据的流化和负载,RTCP负责RTP数据报文的传输控制。此协议是通过客户端(接收方)反馈网络的状况,服务器端(发送方)来调整信息采集、发送的速度和压缩率。但是,对于图像采集速度固定,需要软件进行压缩、解压,调整采集的速度会引起采集的数据来不及压缩而直接丢弃,调整编码器的压缩率需要重新设置编码器的参数,重启编码器,相应的解码器也要调整,这个过程中需要很长的时间,达不到实时的要求。所以本文没有采用RTP/RTCP协议,而是从发送端出发,实时判断网络状况,采用“停等”策略进行实时传输。 网络通信有两种协议TCP和UDP,UDP更适合于网络环境下的视频传输,但是它不提供检错和纠错功能,一旦网络出现堵塞时,大量的数据报文会丢失。对于Divx编解码技术,是以帧为单位进行编解码的,分为关键帧和非关键帧。在传输过程中,由于压缩率比较高,只要一帧中错一比特位,将影响其它几百甚至几千的比特位,直接造成图像的模糊、花屏等现象。只有等到下一次关键帧的到来才有可能恢复图像的清晰。为了保证传输的正确性,自己需要在应用层制定协议。如此一来,UDP的优势荡然无存。所以本文选择使用TCP来进行网络通信。综合使用VFW技术、流媒体技术,辅助以“停等”控制策略,较好的解决局域网中实时视频传输容易引起的重影、抖动、花屏的问题。 实时视频传输实现 为了达到视频传输的实时性,总的思想是最少的发送冗余信息,最大程度上发送最新的视频。局域网实时视频传输采用服务器/客户机模式,利用VC++实现。视频采集采用AVICap从视频采集卡捕获视频图像,得到的是位图型式的视频帧,然后用Divx编码器进行压缩,通过Winsock实现压缩后的视频数据在局域网中的实时传输,接收完的数据交给Divx解码器解压,最后实现视频显示。 在VC++中,采用VFW技术,客户端通过capSetCallbackOnFrame()注册回调函数,当采集卡采集到一幅图像后,系统就会自动调用回调函数,然后再回调函数中使用ICSeqCompressFrame()函数进行压缩。然后再通过Winsock将压缩后的数据发送到服务器端。服务器端接收完一帧以后,交给ICDecompress()解压,最后用SetDIBitsToDevice()将图像显示出来。 1、视频帧的组建 视频采集的数据是位图型式的视频帧,Divx编码器压缩以后形成以帧为格式的Mpeg4流。Divx解码器也是以帧的格式解压。所以提出以帧为单位发送视频数据流。 完整的一帧由5个字段组成,各个字段的意义如下:帧开始标志,标志着一帧地开始,占用4个字节的空间。不妨设为0xffffffff。帧大小,表示整个帧的大小,包括5个字段的大小,占用4个字节的空间。帧编号,表示帧的顺序编号,占用4个字节的空间。帧类型,标志此帧是否是关键帧,占用1个字节的空间。帧数据,存放压缩后一帧的完整数据。 2、视频帧的发送 实时视频传输为了实时,要不断地将压缩好的数据发送到接受端。所以在发送端创建一个线程,专门用来发送数据。同时主线程仍然不停的采集数据并进行压缩。不妨假设创建的线程名为sendThread,核心代码实现如下: while(1) 线程中发送的数据帧是按照上一节中的方法组建好的数据帧。这种方法能够保证正在发送的当前帧能够完整地到达接收端。 注意此线程中刚开始或者每当发送完一帧以后,线程就转到挂起状态,等待外界唤醒。这个任务由回调函数完成,在回调函数中,判定如果发送线程准备就绪(处于挂起状态),则进行图像压缩,然后唤醒线程发送压缩完的数据,否则直接跳出,等待下一次调用回调函数,这种策略称之为“停等”策略,在后面有详细介绍。 3、视频帧的接收 接收端最重要的是从接受的数据流中提取出完整的一帧。方法的思想是:首先从数据流中寻找帧开始标志,再从紧挨后面的数据中提取出帧的大小,然后再从接收缓冲区中读入该帧剩余的数据。再寻找下一帧的开始标志,如此往复。同样接收端创建一个线程专门用来执行数据接收。不妨假设线程名为recThread,核心代码实现如下: while(temp!=SOCKET_ERROR) 以上程序执行的结果是将完整的一帧(除帧开始标志)保存在imageBuf中。 4、“停等”控制策略 如果局域网通信速率很高,而且工作稳定,则按照以上说的方法进行实时视频传输,不需要任何控制策略,就可以达到非常好的效果。但是在很多情况下,网络会出现异常,这样会导致数据传输率明显下降,造成发送端数据积压,等待发送的数据不能正常发出去。此时就要采取一定的策略来控制发送端,以达到实时性的要求。 上文发送程序中,变量isOK是用来表示发送端当前帧有没有发完,如果发完则置为true,同时也表示发送端准备就绪,可以继续发送数据,否则为false。那么可以用isOK来通知视频采集和压缩线程,如果isOK为true,则可以采集视频并且压缩,然后唤醒发送线程继续发送新来的帧数据,否则一直等待,直到网络可以继续发送数据(isOK为true)。当然,视频采集一直不停的进行,那么当网络发生数据堵塞时,只要不让编码器进行压缩则可解决;当网络恢复正常时,继续进行压缩传输,换句话说,当网络发生堵塞时,直接抛弃等待发送的帧,保证一旦网络恢复时,发送最新的压缩帧。当然要保证一旦有一帧开始发送,就要将其完全发出。 按照这样的“停等”策略进行实时视频传输,只会带来一个问题:当网络质量差时,接收端画面中的移动目标会出现瞬间移动的现象。但是这种策略会保证不会出现重影,抖动,花屏等现象。 结论 本文提出的实时视频传输方案在100M的局域网、10M局域网和11M无线局域网中进行了测试。测试时让一个目标在镜头前(发送端)移动,观察接收端视频的显示。在不同的局域网中进行了多次测试,每次测试时间从10分钟到30分钟不等,并且改变目标的运动速度进行实验。最后将数据汇总,得出统计结果。从实际测试的结果看,效果是良好的,除了出现瞬间移动外,图像能够保持清晰,消除了由于网络质量差而导致的重影、抖动等现象,对于不同的局域网都能满足实时传输的要求。 2006/9/14 恍若隔世 现在的感觉真的可以用恍若隔世来形容。
今天中午正在睡午觉的时候,班长突然给我打电话,特意通知我周六聚会的事情,问我是否有时间。让我感觉真的是太高兴了。虽然已经有很多人告诉我班长要回来了,大家可能要聚一聚。不过没有想到他会自己给我打电话,真的是很开心。
时间过的真快啊,转眼毕业都两年的时间了。从毕业以后我就再也没有见过他和惠宇。当然,毕业以后再没有见过的人有很多,但班长是个比较特别的人。特立独行,而且很有见解,对我相当的好。他总是一针见血地指出那些我不愿意面对的事实的真相。无论是当时还是现在,我都一直很佩服他。
突然要见很多的人,有些人真的是挺想再见见的,还有一些我不想见到的,感觉很烦。感觉自己是挺小心眼的,事情真的是过去了很久很久了。现在觉得宽恕、原谅等这些字眼的词,感觉都很刺耳。任何一个人说出来都是很简单的,只要你不是身在其中。到是遗忘比较好吧,人总是向着自己快乐的方向前进的。
上次回学校好像还是元旦聚会的时候,又快一年没有回学校看看了。忙只是一个借口,真的觉得是没有回去的理由。可能是该回去看看了。要面对的总是要面对,逃避不是永远的办法。只要微笑,心里就是暖暖的。
微笑,一直微笑。因为我很快乐,向往更精彩的生活。 2006/9/9 碟中碟3![]() ![]() ![]() ![]() 译名:谍中谍3 导演:J.J·艾布拉姆斯 J.J. Abrams 主演:汤姆·克鲁斯 Tom Cruise 菲利普·西摩尔·霍夫曼 劳伦斯·费什伯恩 Laurence Fishburne 乔纳森·莱斯-麦尔斯 凯莉·罗素 Keri Russell 类型:动作/冒险/悬疑/惊悚 级别:PG-13(紧张动作场面) 片长:120分钟 发行公司:派拉蒙 Paramount Pictures 上映日期:2006年5月5日 剧情:秘传指令一触即发 铤而走险的极限生活虽然刺激,但秘密特工伊森·亨特自从遇见了美丽未婚妻朱莉娅之后,也英雄难过美人关,决定隐藏身份和未婚妻组成幸福的家庭,只负责为训练IMF机构安全部门新特工的工作。然而甜甜蜜蜜的正常人生活没过多久,伊森最引以为傲的女特工徒弟琳德赛就被邪恶的欧文·戴维恩捕获,戴维恩不仅以冷血而残忍的“恶魔”著称,也是国际上最大的军火贩子和情报商人。 在IMF特工领导布拉塞尔的劝说下,为了救出琳德赛,伊森终于同意暂时返回回特工组织。再次组织起天衣无缝的特工小组,率领着电脑专家卢瑟、爱尔兰籍的伪装及语言专家德克兰和美丽迷人的女特工珍,伊森决意要和他最恐怖的敌人戴维恩斗智斗勇、设下天罗地网,在毁灭还没发生前阻止一切! 即将面对的任务如同噩梦,然而谁也没料到,恐慌还在升级——当戴维恩绑架了伊森深爱的妻子朱莉娅,事情变得更加失去控制。酷帅特工伊森将第三次面对高难“不可能任务”:面对前所未有的恐怖敌人,越过重重的死亡挑战,穿越整个世界,解救自己深爱的女人,还要在同时拯救这个又一次陷入困境的世界 花火 昨天晚上看了超级女生,虽然最喜欢的歌手已经被淘汰了,可依然能看的津津乐道。不过我没有为任何一个超女投票,这么说在某些人的眼里根本算不上超女的fans。难道一定要花大价钱支持她们就是最好吗?就象昨天晚上许飞的都生病了,为什么还要一定留在台上呢?此时此刻,她已经拥有了很多喜欢她的人,为什么不能让她这段时间不要再唱歌了,好好休息一下嗓子,不也是一件很好的事吗?
可能要让我说特别喜欢谁,我也都说不清楚,可能就是喜欢那种感觉,看她们在台上或安静,或热闹唱她们心里的歌。不过有一点点偏向。喜欢许飞在长沙赛区时候唱的《爱我别走》,历娜唱的《我要我们在一起》,尤其是历娜唱歌时候的表情,专注,特别的眼神,嗓音特别的干净,真是好听。谭维维,党宁,……
有一些不喜欢的人,Reborn等,总觉得她们的实力很烂,竟然还能成杭州唱区的冠军,真是不可思议。昨晚她们被淘汰了。心里还是有一点舍不得,不想看着她们一个一个都离开,最后把话筒插在话筒架上。我不喜欢离别的感觉。还有韩真真最后唱的《花火》,很好听,虽然我一直都不是很喜欢她。离开的人印象最深的是杭州唱区的第十名,孙闻雍,挺喜欢她唱歌的,尤其是被淘汰以后,边弹钢琴,边唱的那首歌。我想她的支持率比较低原因是她的小辫子,不是所有人都喜欢她的小辫子的,尤其是这样一个容貌也很重要的舞台。特讨厌张姗姗,很做作的样子,尤其是被PK的时候哭哭啼啼的样子,希望用眼泪来赢得同情,很讨厌。
今天下了花火来听,还是很好听。从早上下下来,一直听到晚上。连歌词都被下来了,花花说我总是这样,一首歌听一天,呵呵,自己开心最重要了,不是吗?
歌词如下:
词曲:梁咏琪
来吧伴我飞 多久都不会累 我已不在乎 所谓的是与非 如果爱是朵 很脆弱的玫瑰 我也愿意承受 不完美中的完美 原来风雪可以 让我坚强让我感动 坠落在我的梦 只要一点火种 依然照亮我笑容 原来命运还有 一些在我掌握之中 眼泪的朦胧 透着一道彩虹 烟雾在消散 花火生命短暂 灯塔永不孤单 因为你是海岸 如果爱是朵很脆弱的玫瑰,我也愿意承受,不完美中的完美……
烟雾在消散,花火生命短暂……
2006/9/6 碌碌无为 这一上午让我挥霍的。
八点半来到实验室,什么都不想干,今天早上临起床前做了一个梦,又回家了,爸爸在阳台上看电视(不知道为什么电视会到阳台上了),我在七点种的时候醒了一下(注意,这是真实时间),想着还有很多时间才起床。于是做的上面的那个梦。那么这么长的时间干什么好呢?觉得家里的地很脏。于是就拿抹布来擦地,边和爸爸聊天。我还说咱家的阳台的地砖怎么没有了,爸爸说是老妈给拆了,地上露着水泥的颜色,擦了好半天,感觉抹布上都没有水了。于是拿了一个大水桶(不知道自己为什么没有拿盆),顺道把阳台上的花都浇上水。爸爸说他今天下班比较早,昨天下午也没有什么事,就是没有早回来。正说着呢,我就醒了。看看表,已经七点四十了。伸个懒腰,坐起来,突然很想爸爸。发个短信问问他在干什么呢?
到了实验室,先登QQ,然后上MSN,打开空间,把昨晚的烦心事写下来。然后打开一篇文献,看了一下,感觉很没有意思。然后打开浏览器,看了一下MSN主页上的新闻,在然后打开工程之家,浏览一圈。再然后随便点了一个人的博客看了一下。再然后,还是觉得很没有意思,看看表,还不到十点,于是又回来写点流水账。
前几天看了一个电影,是个老片子,不过我一直都没有看过,假期的时候看电影介绍,感觉挺有意思的,估计我要说出来名字,大家都要笑死了。先贴个图好了。
可爱的小丑鱼爸爸,健忘的多莉。哦,还有可爱的大鲨鱼,它们的口号就是,鱼类是朋友,不是食物,哈哈,搞笑,很可爱! 吃喝玩乐,勤劳勇敢 看来看去,好像只有不开心的日子才会来这里写东西。而所有开心的,玩的忘乎所以的时候,总是觉得没有什么可写的。有时候觉得人真的是很麻烦。
距毕业的日子 越来越近,以前一直都觉得很想早点、快点毕业。靠自己的能力得到薪水,可以想干什么就干什么,不是挥霍的意思,只是觉得,只有那个时候才可以真正的花自己的钱,做自己想做的事。
昨天给妈妈打电话,又谈到了工作的问题,突然感觉很沮丧。不知道自己一直的想法是不是错了。放假的时候问妈妈,如果我到外地工作,她会怎么想?我知道她当时理解错了,她以为我说的意思是,他们不在我的身边,不能照顾我。其实我是想说别人家的孩子都在身边,我却不能随时照顾陪伴他们?
有时候想自己一个人去一个陌生的城市真的有点打怵,不知道会怎么样?不过现在想这些还有点太早了吧,“行动使人勇敢,观望使人退缩”。往往事情做了就没有那么难了。
昨天看了一句话:“人生就是:吃喝玩乐,勤劳勇敢!”
2006/9/4 秋天来了 这两天有点迷糊,确切点应该说是不知道自己要干什么。
老板前一个星期给我们布置了一个任务,要在5号也就是明天前把论文的大框写一写。据我耳朵当场采回来的数据进行分析以后,我的结论是只要写一点点就好了,有个整体的构架就可以。可经过小范围讨论,发现,小部分人认为是要写个20-30页的长篇大论。昨天傍晚时分,碰到小孙,她问我写了多少,我说只写了两页。她就问我不写了吗?我一时无语,不知道要怎么回答好。男生,至少是我们屋的男生,一点写的意思都没有,唉~
感觉真的是不想写,最近一直都很烦也很茫然的感觉。不知道自己想干点什么?写论文?做简历?做项目?可不可以有一件事就那么静静地发呆,什么都不用干?
也不知道自己到底心烦什么?昨晚强子给我打电话,好久都没有和他联系了。不知道是我心情不好还是怎么搞的,说到最后他也不太开心,我就有一种想哭的感觉。波仔和惠宇10号就从新疆回大庆了,在学校的时候都觉得他们最终不会在一起,可是人家最终修成正果了。这次回来举办婚礼,老同学又能聚一聚了。一定会很热闹。可我有想逃避的感觉,逃到一个没有人认识我的地方。
好烦,我该怎么做? 2006/9/2 时间过的好快~无意中去老贝的Q-ZONE,伤心是什么感觉?
似乎只是想一个人静静地呆着,什么都不想……
时间会慢慢流逝,说起来好容易,不能面对为什么不选择逃避~
老贝,很想你? 人生有很多事,经历过了才知道它是什么样子, 有失去就会有得到, 人要平平安安,一切都按自己的心意过一辈子真的很难, 我一直觉得,无论最后的结局是怎么个样子, 当时的那份心情,而且自己问心无愧地认真做好每一件事。 那就对的起自己的心,是自己选择的,自己的人生。 无论什么人,都不是你全部的人生。 别人只是分享你的快乐,分担你的痛苦,而内心的感受只有自己最清楚! 无论什么时候骄傲地做好自己,一切都要自己开心。 时间会慢慢地流逝~ |
|
|