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.pswp.cn/news/377227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377227.shtml
英文地址,請注明出處:http://en.pswp.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…