中關村在線軟件資訊】12月21日消息:Adobe Flash正在被逐漸被拋棄,現(xiàn)在Facebook也實現(xiàn)了將全站視頻默認從Adobe Flash切換到了HTML5。
Facebook前端工程師Daniel Baulig在一篇博客中表示:“我們?nèi)詫⒗^續(xù)與Adobe合作帶來更加安全可靠的Flash平臺游戲體驗,但會在所有瀏覽器上默認改變視頻內(nèi)容”。
HTML5
Bauig表示:“我們決定一開始只向小部分瀏覽器用戶推出HTML5版本,不過隨著改進和修復,今后還會不斷向更多版本的瀏覽器和操作系統(tǒng)進行推送。”
這也可以說明HTML5才是未來的歸宿,Adobe Flash注定要被淘汰,在有條件的情況下網(wǎng)站們還是盡早部署吧。
2016年10月(Chrome 54)開始,Chrome不再內(nèi)置flash,而是改為用戶第一次訪問flash資源時提示安裝。從Chrome62開始,不再提供“click to play的選項”,改為點擊視頻box后,左上方彈出
這意味著,flash作為過時的標準將被新技術所取代。
前言
從我們可以在網(wǎng)站上播放視頻開始,到h5播放器們?nèi)缁鹑巛钡匕l(fā)展之前,使用flash一直都是web播放視頻的不二之選。甚至于說得更加廣泛一些,在html5成為主流之前,網(wǎng)站的多媒體能力,包括動畫、游戲和視頻一直都是adobe生態(tài)在掌控。那么隨著html5標準的推出,這一切都成為了過去式。
flv的全程是 Flash Video,顧名思義,就是專門給flash播放器提供的播放格式,這種格式具有結構簡單、清晰的優(yōu)點,最早出現(xiàn)是為了解決flash導出的swf文件體積過大,不適合在web中播放的問題。隨著flash的逐漸淘汰,新的video標簽自然是不支持flv格式的,人們開始把web視頻的重點放在mp4或者hls上,但是隨著直播這種視頻形式的火熱興起,flv迎來了新一輪的生機。
我們來橫向對比一下可用的直播方案:
flv播放實現(xiàn)·跳轉·清晰度切換
可以看到,flv由于其編碼格式的特點,只需要一個MetaData 以及音視頻Track各自的Header就可以在任意的時間點播放,極大地符合實時直播的需求,在GOP足夠小的情況下甚至可以達到0延遲,可以說在現(xiàn)有的技術方案里,http-flv是最理想的一個,正是因此,flv依然是web播放器不可或缺的一個格式支持。
首先我們通過一張圖了解一下前端播放flv的過程
從上圖可以看到,flv播放的過程其實是從flvt中提取元信息、音視頻header以及數(shù)據(jù),然后轉碼成fmp4盒子結構的過程,再通過MSE交給video的過程。因為flv的結構本身就是流式的,也就是說,它的數(shù)據(jù)被拆分到了很多個小的tag中,所以我們可以很方便地做數(shù)據(jù)的封裝,也就是說將一段flv tag數(shù)據(jù)封裝成一個獨立的moof_mdat盒子對,然后就可以直接交給MSE處理,非常的方便。這里我們討論flv是如何處理加載、跳轉播放、重放及清晰度切換問題的
數(shù)據(jù)加載 數(shù)據(jù)加載直播和點播兩種模式,首先來聊一下點播:針對點播的數(shù)據(jù)獲取,我們采用Range這個參數(shù)作為分段加載的控制參數(shù)
如上圖,Range這個參數(shù)向服務器描述了希望加載一個flv文件的 100000 到 3987705 個字節(jié) 這段數(shù)據(jù),相應的,服務器也需要能夠根據(jù)Range參數(shù)正確返回這段數(shù)據(jù)。這里展示一個極簡的服務端代碼:
從上述代碼可以看到,服務端是先是解析range,根據(jù)range切出文件分段,然后返回一個readableStream交給前端。
再看一下直播:直播跟點播是非常不一樣的數(shù)據(jù)流動結構,我們看一下簡單的直播流程
可以看到,直播的流程是一個 推流->服務端格式編碼-> 終端播放 的一個流程。那么這里就帶來了一個問題,我們不可以像點播時那樣去加載數(shù)據(jù)了。因為服務端實際上保存的是一個文件流,不斷有數(shù)據(jù)推到服務端,播放器也不存在緩存一段數(shù)據(jù)這樣的情況,而是不斷向服務器請求,只要有新的流到達服務端,播放器就要拿到這一段進行解碼播放,達到推流和拉流同步進行的一個直播效果。為了實現(xiàn)這種效果,在播放器內(nèi),我們使用 fetch+ streamReader,簡單的實現(xiàn)如下:
從上述代碼我們可以看到,我們通過一個reader遞歸地從流里面讀取數(shù)據(jù),再將數(shù)據(jù)交給解碼器進行處理。關于直播的數(shù)據(jù)加載還有更加先進的websocket方式,這里不再深入探討,有興趣的同學可以自行查閱相關資料。
播放時跳轉 播放時點擊進度條跳轉(下稱seek)是一個非常高頻的操作,尤其是在長視頻中。用戶遇到不想看的部分,或者想重看的片段,都會點擊進度條觸發(fā)seek。舉個例子,一段視頻,可能用戶實際觀看的部分只占不到50%, 如果我們將整段視頻加載,那剩下加載的50%就浪費掉了。所以我們要做的事情就是精確地加載用戶希望播放的部分,節(jié)約流量。解決方法如下:
這里說起來簡單,但是涉及到了一個跟flv格式緊密相關的問題,那就是flv的onMetaData信息里是否具有keyframes這個屬性。我們上述所提到的,基于時間點計算某一幀位置的算法,是完全依賴keyframes這個屬性的,它記錄了flv中所有關鍵幀的時間點和文件偏移量,keyframes大概長這個樣子:
times中每一個時間點都對應著同位置的fileposition的偏移量,正是基于這一點,我們可以計算需要加載的數(shù)據(jù)Range。值得注意的一點是,并不是所有flv文件都攜帶了keyframes頭,flv文件缺失部分onMetaData屬性是很常見的事情。缺失了keyframes信息,我們就沒辦法做跳轉了,因此我們需要借助額外的工具幫我們補全flv的onMetaData。這里推薦使用yamdi,一個輕量級的工具,有興趣的同學可以看一下它的使用。
清晰度切換 清晰度切換是一個非常重要的功能,為什么重要呢,因為用戶會根據(jù)網(wǎng)速的快慢,去選擇更清晰或者更流暢的視頻。假設沒有這個選項,用戶看視頻卡頓了沒法切換清晰度,就只能憤憤地關掉窗口了。那么多個清晰度的視頻源我們?nèi)绾巫龅綗o縫的切換呢?我們分情況來討論一下:
點播中的清晰度切換方案 點播的切換清晰度是比較容易實現(xiàn)的,流程如下
如圖,簡而言之,就是嘗試加載視頻B,通過從視頻B的onMetaData中提取關鍵幀信息,推算出當前應該加載哪一個關鍵幀,然后加載這個位置之后的數(shù)據(jù),直到數(shù)據(jù)加載到之后,將視頻B的數(shù)據(jù)交給MSE,同時,清除掉之前視頻A在buffer中的緩存。
直播中的清晰度切換方案 直播清晰度切換目前還沒有發(fā)現(xiàn)無縫的方案,因此建議在切換時,直接重建解碼器以及MSE,關于這方面的問題我們還在探究。更多內(nèi)容請關注我們的開源播放器
http://h5player.bytedance.com/
歡迎來我們github提issue (下方擴展鏈接)
取前端學習資料及視頻進群:532018971
HTML 很容易寫,但創(chuàng)建網(wǎng)頁時,您經(jīng)常需要重復做同樣的任務,如創(chuàng)建表單。在這篇文章中,我收集了10個超有用的HTML 代碼片段,有 HTML5 啟動模板、空白圖片、打電話和發(fā)短信、自動完成等等,幫助你提高開發(fā)速度。
一、HTML5 啟動模板
當啟動一個新的項目的時候,你需要一個啟動模板。這里是一個簡潔干凈的模板,可以作為 HTML5 項目的基礎。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled</title>
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]-->
</head>
<body></body>
</html>
二、Base64 編碼的空白 GIF 圖片
我不推薦使用透明的 GIF,但我知道,即使在2013年,很多人都還在使用他們。如果你是其中之一,你可能會享受這個 Base64 編碼的 1 * 1px的空白 GIF。這種方式比使用的圖像更好。
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
三、獲取方位的表單 (Google Maps)
這里是一個簡單但功能強大的表單代碼,用戶可以輸入他的位置指示到特定的地方。對于聯(lián)系頁面非常有用。
<form action="http://maps.google.com/maps"method="get"target="_blank">
<label for="saddr">Enter your location</label>
<input type="text" name="saddr" />
<input type="hidden" name="daddr" value="350 5th Ave New York, NY 10018 (Empire State Building)" />
<input type="submit" value="Get directions" />
</form>
四、嵌入 Flash
獲取前端學習資料及視頻進群:532018971
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。