基于QtWebkit的浏览器视频插件的设计与实现
李迪;丁娅
【摘 要】Videos in web pages can not be played by embedded browser which is based on Webkit. Aiming at this problem, design a simple and effective player plug-in model. Being different from the traditional NPAPI plug-in,this plug-in is registered by inheriting Qt' s class and overloading its methods,the plug-in uses ffplay to get data streams and decode them.it designs the user interface in response to user events and to control ffplay,and realizes the communication of UI and ffplay by FIFO and state machine. The design is finally a-chieved in the embedded platform. The plug-in makes users watch videos in web pages smoothly, which has been proved by the practice%为了解决基于Webkit引擎的嵌入式浏览器不能播放网页中嵌套的视频文件的问题,设计了一种简单有效的视频播放插件模型.该设计区别于传统的NPAPI标准插件,通过继承Qt自带的控件类并重载其中的方法来实现该插件的注册,利用ffplay实现数据流的获取和解码显示,设计用户界面负责响应用户事件并控制ffplay的播放,并通过FIFO管道和状态机来实现播放界面和ffplay的通信.最后在嵌入式平台下实现了该设计.经工程实践表明,该方法行之有效,通过该插件能够流畅观看网页中的视频文件.
【期刊名称】《计算机技术与发展》
【年(卷),期】2012(022)002
【总页数】4页(P238-240,244)
【关键词】插件;播放器;浏览器引擎;嵌入式;命名管道
【作 者】李迪;丁娅
【作者单位】华中科技大学电子与信息工程系,湖北武汉430074;华中科技大学计算机科学与技术学院,湖北武汉430074
【正文语种】中 文
【中图分类】TP393.09
0 引言
近年来,嵌入式市场迅速崛起,嵌入式设备也被广泛应用于各个领域,如智能手机、IP电视
、导航设备等。用户通过嵌入式设备中的浏览器访问因特网成为了一种重要应用,浏览器则需要提供相关插件来支持用户访问互联网上丰富的多媒体信息。文中首先介绍浏览器的层次结构,然后比较了QtWebkit支持的两类插件:NPAPI插件和Qt-based plug-in,经分析选择了后者,最后设计并实现了基于QtWebkit的嵌入式浏览器视频插件,使用户能通过嵌入式设备中的浏览器流畅观看网页中嵌入的视频文件。
1 浏览器插件技术
qt进程间通信1.1 浏览器层次结构
图1是浏览器层次模型图。最底层是操作系统层,包括浏览器引擎正常运作所需的各类软硬件资源;第二层是接口层,提供引擎在不同平台移植所需的接口;第三层最重要,是浏览器引擎层,包含浏览器引擎(如 Webkit)、各类插件及其它第三方库[1];最上层是应用层,完全独立于引擎,用户可根据需要轻松扩展或修改上层应用[2]。
1.2 QtWebkit介绍
Qt是跨平台的图形用户界面工具包[3]。Qt/Em-bedded Linux则是专为嵌入式Linux优化的Qt
版本,其4.5版中集成了Webkit引擎的核心模块部分,简称QtWebkit。Qt强大的功能和良好的平台无关性,使得QtWebkit出现了众多新的扩展应用[4]。
图1 浏览器层次模型图
1.3 QtWebkit支持的两类插件
QtWebkit引入了对NPAPI的支持,NPAPI是多数浏览器都支持的跨平台插件标准[5],它提供两类插件接口[6]:第一类由浏览器端实现,插件调用,以 NPN_开头;第二类由插件端实现,浏览器调用,以NPP_开头。通过撰写一个符合NPAPI标准的插件,并将其编译成动态库的形式放置于浏览器插件默认的位置,即可实现NPAPI插件的注册[7]。
另外,得益于开源浏览器引擎Webkit与Qt4.5的应用程序和UI框架的集成模糊了本地应用程序与网络内容之间的界限,QtWebkit还支持Qt based plug-in,利用它可将Qt自带的控件或用户实现的控件嵌入到Web页面中。QWebPluginFactory是Webkit供应用程序调用的接口之一,应用程序通过继承QWebPlugin-Factory类并重载该类中的方法来实现Qt-based plugin这类插件的注册。
2 设计与实现
NPAPI插件的实现需要X11协议的支持,QtWebkit基于linux framebuffer实现图形引擎,不支持X11协议[8],因此基于 QtWebkit实现 NPAPI插件比较困难。文中选择利用QWebPluginFactory来实现Qt-based plug-in。
2.1 模块结构
图2是浏览器视频播放插件的模块结构图。插件界面(Player Plug-in UI)负责和用户打交道,响应用户事件并控制ffplay的播放。ffplay负责从指定的URL获取数据流并进行解码显示(直接操作Framebuffer),并根据插件界面传来的消息控制界面显示的位置、大小以及视频的播放、暂停等。插件界面和ffplay之间通过创建一个命名管道fifo进行通信,实现插件与ffplay的协同工作。
图2 浏览器视频播放插件模块结构图
2.2 视频播放插件实现流程
在设计中尽量保证模块化设计,使浏览器与ffplay的交互位于应用层,独立于Webkit,避免了每次关于ffplay的代码调整都需要修改并编译Webkit库,使系统更易于维护。视频播放插件的具体实现流程如下:
(1)浏览器引擎Webkit通过RenderPartObject类中的 updateWidget函数检测网页中的<object>[9]或者<embed>标签并对 mimeType、classid、width、height等属性值进行解析;
(2)RenderPartObject类以解析出的各属性值作参数生成插件实例并绘制插件窗口。为保证通用性,在遇到NPAPI视频插件的mimeType时,均统一转换为“MoviePlayer”,生成插件代码如下:
if(classId==tr("MoviePlayer"))
player=new MoviePlayer(view());
其中,MoviePlayer即是文中实现的播放器控件类,通过其构造函数生成一个插件实例并进行一系列初始化,包括控件大小、位置、颜,命名管道的创建,控制按钮的创建和布局,信号和槽的连接等。这样就实现了将自定义的控件嵌入到网页中,Webkit从网页中解析出各
种插件类型,但最终通过转换只使用Qt的插件机制;
(3)FrameLoader通过调用FrameLoaderClientQt类给QWebpage发送signal信号,通知浏览器已经完成了插件的生成和绘制;
(4)浏览器的WebView收到该信号后,通过函数MoviePlayer::showMovie调用ffplay播放视频,这里不用system调用打开ffplay,而是用Qt封装的Qprocess类调用 ffplay,具体代码是 process.start(“ffplay”,args),参数args中包含视频编码格式、宽度、高度、帧率、url以及命名管道的读写文件路径等信息;
(5)ffplay播放结束后,MoviePlayer发信号通知浏览器,WebView调用浏览器主窗口的reShow函数实现浏览器主窗口和插件窗口的重绘。
2.3 关键技术描述
在视频播放插件的设计和实现过程中,主要完成了自定义的视频播放插件类MoviePlayer,并实现了插件与播放器的友好互动和协同工作。关于MoviePlayer的初始化、调用以及其与浏览器和播放器之间的信号交互在2.2节中已有相关描述,下面介绍其它所涉及的关键技术:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。