HTML5 video

摘要:本文主要介绍HTML5 video在android2.2中实现的主要架构和程序流程。

一、实现HTML5 video主要的类

1.  主要类结构及介绍

  

 

    图1中绿色类为java类,其余为c++类,下面是各个类的具体介绍:

(1) HTMLElement类不是最上层类,其父类可追到为Node类。为了表述方便省去了上面的类继承结构。该类是一个通用基类,大部分HTML元素都需要继承该类。

(2) MediaPlayerClient类是一个接口类,HTMLMediaElement以私有方式继承了部分函数,主要作用是媒体播放状态改变时通过MediaPlyer在MediaPlayerPrivate中调用。

(3) HTMLMediaElement类完成了video元素大部分行为和属性的定义。包括audio元素也是继承该类。

(4)HTMLVideoElement类实现了很少的功能,在android中没有涉及该类。

(5)MediaPlayer连接播放功能类和媒体元素类的交互类。在HTMLMediaElement中定义了该类的成员指针变量m_player,在完成播放等功能时将会调用该类。

   另外在该类定义了一个Media引擎容器,用来保存所有注册的可提供播放支持的类,比如MediaPlayerPrivate。在需要时会根据媒体资源的需要选择最好的支持类。

(6) MediaPlayerPrivateInterFace是一个纯虚函数类,定义了主要和播放相关的函数。在MediaPlayer中定义了该类的成员智能指针变量m_private。

(7)MediaPlayerPrivate该类继承了MediaPlayerPrivateInterface类。该类主要用于和HTML5VideoviewProxy类交互。定义了一个HTML5VideoviewProxy类的代理结构成员变量m_glue,用来保存HTML5VideoviewProxy类的实例和方法。

 (8) HTML5VideoviewProxy提供具体的播放。该类通过调用系统系统videoview.java类来实现播放。定义了两个静态内部类,一个用来完成具体播放调用。另一个用来完成video poster的下载。另外该类会调用webview.java的chromeclient类成员来实现videoview的显示和隐藏,默认poster的资源获取,progress view的获取。所以要支持HTML5 video,上层webview应用必须重载chromeclient类的相关函数。

2.主要类架构和功能分析

 从上面简要分析可以看出主要类分了三类:

一类是video元素类(HTMLElement, HTMLMediaElement,HTMLVideoElement)

第二类是架构类和接口(MediaPlayerClient,MediaPlayer,MediaPlayerPrivateInterface);

第三类是具体实现播放功能的类(MediaPlayerPrivate, HTML5VideoviewProxy )。该部分是我可以移植的,可以添加自己的播放类。

  既然可以实现动态添加功能模块,那么需要遵守什么。通过源码可以看出播放类需要实现:提供静态注册函数,用来注册自己;对象创建函数(调用构造函数的函数);支持的数据类型函数;支持的类型和解码器名字函数。这样MediaPlay在创建播放类时会根据支持情况选择。

另外,播放类还必须实现MediaPlayerPrivateInterface中定义的函数,这样MediaPlay才能通过接口调用具体播放功能;在播放类中也可以调用MediaPlay中的关于播放状态变化等函数,然后MediaPlay通过MediaPlayerClient接口类调用HTMLMediaElement中具体的实现。将播放状态返回给媒体元素。

 

二,视频元素处理流程

    在程序完成下面两个流程后,就可以播放一个视频资源。

1.  类实例初始化流程

浏览器引擎加载完HTML文档后,开始解析里面的元素搭建DOM tree, Render tree和加载子资源。在解析video元素时,会创建HTMLVideoElement类对象和对应的RenderVideo对象(因为大部分行为是在基类HTMLMediaElement中完成,所以下图标识的是HTMLMediaElement)。对于src属性引擎会调用HTMLMediaElement的loadResource函数,如果没有该属性或source子元素,就不会有下面的流程。

 

 

    图2表示了HTMLMediaElement的loadResource函数内部的主要调用流程。首先调用MediaPlay的create函数。然后调用MediaPlayer的load函数,在load函数中会注册媒体引擎,并根据content type选择最合适的engine。然后通过engine调用对应播放类的实例创建函数,然后调用播放类的load函数保存媒体资源的url,返回到MediaElement。接着判断是poater url是否存在,若存在保存到播放类。接下来媒体元素会调用RenderVideo的updateElement函数。在updateElement函数中调用updatePlayer并调用到MediaPlay的setvisible函数,然后调到播放类的setvisible并创建java播放类和设置video poster。Rendervideo是怎么调用到MediaPlay的函数呢。因为在Element对象和Render对象中都保存对方的指针,在MediaElement中又保存了MediaPlyer指针。引擎在创建Element后,便会调用element的attach函数创建对应的Render对象。

2. 播放调用序列

在js中调用video.play()方法时,程序会调用到HTMLMediaElement的play函数。最终会调用到HTML5VideoviewProxy的play函数。

 

 

 

 

 

三、总结:

对于媒体资源的回放,解码是最大的难题。既然想通过浏览器来直接支持视频播放,那么也必须考虑这个问题。所以在源码中有Media engine vector的设计,用来根据contentType选择最佳media engine。在目前android2.2源码中只有Mediaplayerprivate一个media engine。而该播放类,最终也是调用了系统java接口videoview。并传给了媒体资源的url。对于解码的支持完全取决于终端系统。

Android对video元素支持很有限。比如video的controls、autoplay、preload等都没支持。对于autobuffer的值虽然有设置,但是对于播放器并没有用到。对于HTML5中定义的很多规则都没有实现,所以,android对HTML5 video的支持很有限。

在android中HTML5 video有自己的特性。从上面的流程中可以看出,虽然架构设计了通过元素来控制播放和将播放状态从播放类返回给元素,但在实际播放按键响应和控制由videoview完成,js也可以控制播放(比如一开始的play调用)。 播放界面是videoview的controller提供,和引擎里面定义的RenderMediaController没有关系,可能在chrome中播放出现的控件是该类画出来的。

        另外,在android中并不支持<audio>元素。

转载于:https://www.cnblogs.com/tanqiantot/archive/2012/09/11/3126857.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《MySQL——使用联合索引、覆盖索引,避免临时表的排序操作》

联合索引避免临时表排序 在上一篇笔记(MySQL——order by逻辑&#xff08;全字段排序与rowid排序&#xff09;)中&#xff0c;讲到查询语句查询多个字段的时候使用order by语句实现返回值是有序的&#xff0c;而order by是使用到了临时表的&#xff0c;会带来时间和空间损失。…

明源面试

明源面试&#xff0c;笔试题目如下 一、SQL测试题 1 有两张表 根据给出的SQL语句&#xff0c;写出返回的行数分别是多少&#xff1f;为了形象直观的显示&#xff0c;我给出了sql语句执行结果。 A 学生表 B分数表 新题目 select a.* from a inner join b on a.idb.id; …

AEAP的完整形式是什么?

AEAP&#xff1a;尽早 (AEAP: As Early As Possible) AEAP is an abbreviation of "As Early As Possible". AEAP是“ April越早”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

jquery 视觉特效(鼠标悬停时依次显示图片)

效果描述&#xff1a; 有几副图片&#xff0c;让他们依次叠加重合。首先显示第一张图片。然后鼠标悬停在上面&#xff0c;边框变化。然后离开&#xff0c;然后第一张淡出&#xff0c;第二张淡入。接着悬停在第二张图片&#xff0c;边框变化&#xff0c;然后离开&#xff0c;第二…

《MySQL tips:查询时,尽量不要对字段进行操作》

维护一个交易系统&#xff0c;交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 建表语句如下&#xff1a; create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_mo…

cocos2dx blender 骨骼动画实现

前言 cocos2d-x 中相关部分代码介绍 背景知识介绍 参考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 简单3d 模型支持 第一步实现对3d 模型的简单支持&#xff0c;完成一个CCSprite3D 类 参考CCSprite 类 以及 CCGLProgram 代码 主要修改 draw 方法。 添加了定点数组…

关于web.config中customErrors节点说明

关于web.config中<customErrors>节点说明 <customErrors>节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性&#xff0c;其中defaultRedirect属性是一个可选属性&#xff0c;表示应用程序发生错误时重定向到的默认URL&#xff0c;如果…

肯德基收银系统模式_肯德基的完整形式是什么?

肯德基收银系统模式肯德基&#xff1a;肯塔基炸鸡 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN转载)

函数的参数不同叫多态&#xff0c;函数的参数类型可以不确定吗&#xff1f; 函数的返回值只能是一个吗&#xff1f;函数的返回值可以不确定吗&#xff1f; 泛型是一种特殊的类型&#xff0c;它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

维护一个交易系统&#xff0c;交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…

HDU4291 A Short problem

求通项和斐波那契数列的方法一样&#xff0c;矩阵快速幂。 这道题麻烦在套了三层。 但其实取模这种操作肯定会出现循环的&#xff0c;可以先本地暴出循环节&#xff0c;1000000007对应的循环节是222222224&#xff0c;222222224对应的循环节是183120。 最外层的结果是对1000000…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR&#xff1a;Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的缩写 。 它是印度最大和领先的多元…

《MySQL——查询长时间不返回的三种原因与查询慢的原因》

目录查询长时间不返回等MDL锁等flush等行锁查询慢构造一张表&#xff0c;表有两个字段id和c&#xff0c;再里面插入了10万行记录 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

Linux 命令积累 fuser lsof mtr

fuser 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件、目录、设备或套接字;lsof MTR fuser命令 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件、目录、设备或套接字;语法:fuser [-c|-d|-f] [-k] [-u] [-x] [-V] 文件/目录…

线程终止问题

http://topic.csdn.net/u/20080429/09/9cfe5204-20b5-40fb-ac12-afdc1e4939e9.html?590511460 线程终止问题 http://blog.csdn.net/wuyazhe/article/details/1771470 带有消息机制的线程 - CustomMessageQueue(c#) using System; using System.Collections.Generic; using Sy…

HTH的完整形式是什么?

HTH&#xff1a;希望这个(那个)有帮助 (HTH: Hope This (That) Helps) HTH is an abbreviation of "Hope This (That) Helps". HTH是“希望有帮助”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking si…

排序算法复习—希尔排序

希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。 希尔排序将整个待排元素序列分割成若干个子序列&#xff08;由相隔某个“增量”的元素组成的&#xff09;分别进行直接插入排序&#xff0c;过程中较小的元素&#xff0c;跳跃式的往前…

《MySQL——幻读与next-key lock与间隙锁带来的死锁》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);该表除了主键id&#xff0c;还有索引c。 问下面的语句…

css 阴影 效果_CSS阴影效果

css 阴影 效果CSS中的阴影效果 (Shadow Effects in CSS) It is always good to make our web pages stylish and beautiful, web pages that would catch users eyes instantly but one gets confused as to how to style his or her web page. The confusion is quite legit t…

java常见的ClassNotFoundException-----菜鸟学习java

java常见的ClassNotFoundException 1 - java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 添加包common-logging.jar2 - java.lang.ClassNotFoundException: javax.transaction.Synchronization 添加包jta.jar(hiberante)3 - java.lang.ClassNo…