在线视频变速播放的研究与实现 张鹏,王尊亮** 作者简介:张鹏(1988-),男,硕士研究生,主要研究方向:计算机网络与多媒体通信 通信联系人:王尊亮(1981-),男,讲师,主要研究方向:视频编码、图像处理. E-mail: wangzunliang@bupt.edu.cn (北京邮电大学计算机学院,北京 100876) 5 摘要:如今互联网时代流媒体业务正变得日益流行,视频类业务更是发展迅猛。互联网中涌 现出大量的视频网站,竞争也是异常激烈,然而这些视频网站提供的在线视频服务大都是视 频的常速播放,并没有提供快速或慢速播放的功能,用户体验性较差。本文首先介绍了在线 视频的工作原理,然后在此基础上提出了在线视频变速播放(快放、慢放)的实现方案,最 后基于Red5 流媒体服务器对该方案进行了实现和测试,对其可行性进行了验证。 10 关键词:流媒体;视频编码;变速播放;Red5 中图分类号:TP37 Research and Implementation of Variable Playback Rate of Online Video 15 ZHANG Peng, WANG Zunliang (School of Computer Science, Beijing University of Posts and Telecommunications, Beijing 100876) Abstract: Nowadays, the streaming media services are becoming increasingly popular, especially the video business is developing rapidly. A large number of video site compete fiercely in Internet. 20 However, the rate of video playback provided by these online video services are almost constant. So, the user experience is poor without the variable playback rate on online video. The paper first introduce the principle of the online video. Then put forward implementation of the variable playback rate on online video. At last, develop and implement this scheme based on the Red5 streaming server, and prove that the program is feasible after testing. 25 Key words: streaming media; video coding; variable playback rate; Red5 0 引言 多媒体技术的发展,给人们带来了前所未有的视觉和听觉感受。如今,网络环境中已经 遍布着各种各样的流媒体应用。其中,视频相关类应用发展尤为迅速,如IPTV、安防领域 30 的视频监控系统、各大视频网站等。主流视频网站,如优酷网、酷六网、搜狐视频等大都以 在线视频的方式为用户提供服务,然而这些在线视频服务都尚不支持视频的变速播放,用户 交互性较差。 所谓变速播放包括快速播放和慢速播放,在线视频播放时用户可以根据自己的兴趣及需 要随时切换视频的播放速度,有选择性地进行快进或慢放欣赏视频。这一功能,可以更好地 35 提高用户交互性和体验性。本文不仅提出了在线视频变速播放的实现方案,并基于一款开源 流媒体服务器(Red5)进行研究并进行开发,完整地实现了该功能,经过全方位测试证实 了该方案的可行性。 1 在线视频工作原理 所谓在线视频是通过采用流式传输的方式在Internet 上播放的媒体格式,用户不需要花 40 费很长时间将多媒体数据全部下载到本地后才能播放,而仅需将起始几秒的数据先下载到本 地的缓冲区中就可以开始播放,后面收到的数据会源源不断输入到该缓冲区,从而维持播放 的连续性。 流媒体系统中要传输的数据量都比较大,所以多媒体数据在传输前必须要先经过有效地 压缩编码,以减少对网络资源的占用率。目前,主流的视频压缩标准有MPEG-4,H.264, 45 AVS 等。经过编码后的视频流由三种帧组成:I 帧,P 帧,B 帧[1]。 I 帧(Intra Frame),关键帧,是一种全帧压缩编码帧,它将全帧图像信息进行压缩编 码,不依赖其他任何帧而独立进行编码; P 帧(Forward Prediction Frame),前向预测编码帧,由其前面相邻的I 帧或P 帧作为 参考帧,进行运动预测而得到; 50 B 帧(Bi-directional Interpolated Prediction Frame),双向预测内插编码帧,以其前的一 个I/P 帧和其后的一个I/P 帧作为参考而得到。 播放器客户端收到这些经过编码的视频流数据后进行解码播放,码流中的任何一帧的解 码都是建立在其所参考或依赖帧的基础上。对于I 帧,不依赖其他帧,可以独立解码。对于 P 帧,只有其所参考的前面的P 帧或I 帧被解码后,当前P 帧才能被解码。对于B 帧,只有 55 其参考的前后向P 帧或I 帧被解码后,B 帧才能被解码[1]。 2 变速播放实现方案 其实,网络中的视频流数据归根结底都是经过压缩编码后的一帧帧的图像数据,由于人 类眼睛的特殊生理结构,会产生视觉暂留效应,如果一秒内显示的图像帧率大于16 的时候, 就会认为是连贯的[2]。下文提出的变速播放实现方案也是通过改变视频播放时的帧率实现 60 的。 假设视频流的原始帧率为FrameRate 帧/秒,总帧数为FrameSum,视频帧帧号依次为 1,2,3……i……,每个视频帧的时间戳为i TimeStmamp (i 为帧号)。 2.1 快速播放 快速播放一般是指以原始播放速度的特定倍率进行快进播放。成倍地提高视频的播放速 65 率,可以通过提高帧率来解决。 假设要把视频的播放速率提高n 倍,可以修改每帧视频数据的时间戳为i TimeStmamp /n( i TimeStmamp 为帧号为i 的视频帧的原始时间戳),这样视频的帧率变为了FrameRaten 帧/秒。 视频原始的播放总时长为 70 T1=FrameSum/FrameRate 提高帧率后,视频播放总时长变为 T2=FrameSum/(nFrameRate)=T1/n 播放时间缩短为原来的1/n,相应的播放速度提高到原来的n 倍,客户端接收到码流数 据后正常解码播放便实现了快速播放。但是由于帧率的提高,码率也会相应的提高,尤其当 75 倍速很大时,这种方法对网络带宽和服务器产生比较大的压力,并且客户端解码时,计算复 杂度也会随着快速播放倍速线性增加,这些因素会造成视频播放的不流畅。 这种方法虽然可以实现快速播放,但同时也带来了码率上升的问题,为了降低码率,在 上述方法基础上额外采用了一种丢帧的方法,选择性的丢弃一定数量的视频帧,这样在保证 码率不上升的情况下实现了快速播放。假设要以原始速度的n 倍速播放,视频文件中各帧的 80 帧号依次为1,2,3……,流媒体服务器读取第一帧,然后丢弃紧接着的n-1 帧,接着读取 第n 帧,同时修改第n 帧的时间戳为i TimeStmamp /n。这样n 倍速播放时,每读取一帧就 要丢弃n-1 帧。然而,上文中提到过视频帧主要有两种类型:关键帧和预测帧。其中,关键 帧可以独立解码,而预测帧的解码要依靠前面已解码的关键帧。根据这两种帧的解码特点, 在进行丢帧时可以按照以下原则进行处理:如果是关键帧则不丢弃,仅修改其时间戳为 i 85 TimeStmamp /n;如果是预测帧则丢弃,不做处理。这样就可以保证不提高码率的情况下, 实现快速播放[3]。 2.2 慢速播放 同理,慢速播放可以通过降低帧率来解决。假设要以原始速度的1/n 速度播放,可以修 改每帧视频数据的时间戳为i TimeStmamp n( i TimeStmamp 为帧号为i 的视频帧的原始时 90 间戳),视频的原始帧率是FrameRate 帧/秒,修改后变为FrameRate/n 帧/秒。 视频原始的播放总时长为 T1=FrameSum/FrameRate 降低帧率后,视频播放总时长变为 T2=FrameSum/(FrameRate/n)=T1n 95 视频的总播放时间延长为原来的n 倍,相应的播放速度降为原来的1/n,客户端接收到 码流数据后正常解码播放便实现了慢速播放。由于降低帧率,会使得码率也相应的下降,不 会对网络带宽和服务器带来额外的影响。 3 实现与测试 3.1 采用技术 100 基于上述提出的变速播放机制,本文进行了实现验证。经考察调研决定采用如下技术方 案:服务端采用Red5 流媒体服务器,客户端采用Flex 技术。 Red5 是一款基于Java 的开源流媒体服务器,完整的实现了 Adobe 公司开发的针对RIA 多媒体应用的RTMP 协议。Red5 在最底层的网络传输抽象模块使用了Apache MINA,Web 服务器和JSP/Servlet 容器使用了嵌入式的Jetty 引擎,系统的整体配置与整合完全使用Spring 105 框架支撑。Flex 是Adobe 公司的一个高效、免费的开源框架,可用于构建具有表现力的RIA 应用程序,而且其与Red5 服务器相互之间可以远程调用,有很好的交互性、结合性。二者 结合开发多媒体应用程序便捷、高效,是当前成本相对低廉的解决方案[4]。 3.2 实现 按照上文提出的方法,基于Red5 流媒体服务器进行二次开发[4],实现了视频的变速播 110 放[5]。开发中,视频帧率的改变即对视频帧时间戳的修改都是基于一个初始基准时间戳来修 改的,然而用户播放过程中,可能会有暂停、继续播放、拖动进度条到新的时间点开始播放 等操作,当有上述操作时,会更新该基准时间戳,保证视频的正常播放。 3.2.1 快速播放 实现快速播放的核心代码为: 115 //读取一帧 IMessage msg=msgIn.pullMessage(); RTMPMessage rtmpMessage=(RTMPMessage)msg; IRTMPEvent body = rtmpMessage.getBody(); VideoData videoBody=(VideoData)body; FrameType frameType=videoBody.120 getFrameType(); while(dropCount<playBackSpeed){ //如果是关键帧,则不丢弃 if(frameType==FrameType.KEYFRAME){ break; 125 } //如果不是关键帧,则丢弃 else{ dropCount++; //读取下一帧 130 msg=msgIn.pullMessage(); rtmpMessage=(RTMPMessage)msg; body=rtmpMessage.getBody(); videoBody=(VideoData)body; frameType=videoBody.getFrameType(); 135 } } //更新基准时间戳 if (true==needFixBaseTime){ if(Math.abs(body.getTimestamp()–baseTimeStamp)>100){ 140 fixTimeStamp=body.getTimestamp()-baseTimeStamp; } baseTimeStamp=body.getTimestamp(); needFixBaseTime=false; } 145 Timestamp=baseTimeStamp-fixTimeStamp+(body.getTimestamp()-baseTimeStamp)/playBa ckSpeed+timestampOffset; //修改时间戳 body.setTimestamp(timestamp); 150 快速播放的工作流程,如图1 所示。 图1 快速播放工作流程 Fig. 1 the work flow of quick play 3.2.2 慢速播放 155 实现慢速播放的核心代码为: //读取一帧 IMessage msg=msgIn.pullMessage(); RTMPMessage rtmpMessage=(RTMPMessage)msg; IRTMPEvent body = rtmpMessage.getBody(); 160 VideoData videoBody=(VideoData)body; //更新基准时间戳 if(true==needFixBaseTime){ if(Math.abs(body.getTimestamp()-baseTimeStamp)>100){ fixTimeStamp=baseTimeStamp-body.getTimestamp(); 165 } baseTimeStamp=body.getTimestamp(); needFixBaseTime=false; } timestamp=baseTimeStamp+fixTimeStamp-(body.getTimestamp()-baseTimeStamp)playBac 学术论文网Tag:代写硕士论文 代写MBA论文 |