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,一经查实,立即删除!

相关文章

明源面试

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

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

肯德基收银系统模式肯德基&#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;它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

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…

《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…

《MySQL——加锁规则(待补全,有些没看懂)》

catalog加锁规则等值查询间隙锁非唯一索引等值锁主键索引范围锁非唯一索引范围锁唯一索引范围锁 bug非唯一索引上存在"等值"的例子limit语句加锁关于死锁总结 1、查询过程中访问到的对象才会加锁&#xff0c;而加锁的基本单位是next-key lock&#xff08;前开后闭&am…

PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程

这两天刚装好Windows 7&#xff0c;碰巧前段时间有朋友问我Windows下如何安装搭建PHP环境&#xff0c;所以打算勤劳下&#xff0c;手动一步步搭建PHP环境&#xff0c;暂且不使用PHP环境搭建软件了&#xff0c;在此详细图解在Windows 7下安装配置PHPApacheMysql环境的教程&#…

《MySQL—— 业务高峰期的性能问题的紧急处理的手段 》

catalog短连接风暴先处理占着连接但是不工作地线程减少连接过程的消耗慢查询性能问题索引没有设计好语句没写好选错索引QPS突增问题短连接风暴 正常的短连接&#xff1a; 执行很少sql语句就断开&#xff0c;下次需要的时候再重连。MySQL建立连接的过程成本很高&#xff0c;包含…

《MySQL——redo log 与 binlog 写入机制》

目录binlog写入机制redo log写入机制组提交机制实现大量的TPS理解WAL机制如何提升IO性能瓶颈WAL机制告诉我们&#xff1a;只要redo log与binlog保证持久化到磁盘里&#xff0c;就能确保MySQL异常重启后&#xff0c;数据可以恢复。 下面主要记录一下MySQL写入binlog和redo log的…

字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

涉及到字符串的问题&#xff0c;无外乎这样一些算法和数据结构&#xff1a;自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法&#xff0c;而这里面最常用和最熟悉的大概是kmp&#xff0c;即使如此还是有相当一部分人也…

WPF CanExecuteChanged

继承ICommand ,RelayCommand命令 1 public class RelayCommand : ICommand2 {3 private readonly Action _execute;4 private readonly Func<bool> _canExecute;5 public event EventHandler CanExecuteChanged;6 public RelayComma…

《MySQL——主备一致性六问六答》

目录备库为什么要设置为只读模式&#xff1f;备库设置为只读&#xff0c;如何与主库保持同步更新&#xff1f;A到B的内部流程如何&#xff1f;binlog内容是什么&#xff1f;row格式对于恢复数据有何好处M-M结构的循环复制问题以及解决方案备库为什么要设置为只读模式&#xff1…

fyi 在邮件里是什么意思_FYI的完整形式是什么?

fyi 在邮件里是什么意思仅供参考&#xff1a;供您参考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替换 vmwp

要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见&#xff1a;http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下载后腰替换 先把 Hyper-V 的俩服务停止掉 然后找到 C:\Windows\System32\vmwp.exe 右键--安全 替换掉所有者 然后给自己…

ejb模式_EJB的完整形式是什么?

ejb模式EJB&#xff1a;企业Java Bean (EJB: Enterprise Java Bean) EJB is an abbreviation of Enterprise Java Bean. EJB is one of many Java application programming interfaces (API) for flexible and manageable structuring of Java Platform, Enterprise Edition (J…

Android之PreferenceActivity

http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多书中都没有对PreferenceActivity做介绍&#xff0c;而我正好又在项目中用到&#xff0c;所以就把自己的使用的在这总结一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下…

浅谈算法和数据结构: 七 二叉查找树

前文介绍了符号表的两种实现&#xff0c;无序链表和有序数组&#xff0c;无序链表在插入的时候具有较高的灵活性&#xff0c;而有序数组在查找时具有较高的效率&#xff0c;本文介绍的二叉查找树(Binary Search Tree&#xff0c;BST)这一数据结构综合了以上两种数据结构的优点。…

《MySQL——备库多线程复制策略。》

目录备库并行复制能力MySQL5.6版本 并行复制策略MariaDB 并行复制策略MySQL5.7版本 并行复制策略MySQL5.7.22版本 并行复制策略总结备库并行复制能力 主要涉及两个方面的并行度&#xff1a; 1、客户端写入主库的能力 2、备库上sql_thread执行中转日志relay log 1的并行能力…