web 視頻基礎(chǔ)

利用<video></video>我們可以實(shí)現(xiàn)如下功能:

  • 控制視頻的播放
  • 創(chuàng)建自己的定制的視頻界面
  • 使用全新的方式集成視頻與HTML的其余部分。

在HTML加入視頻功能需要添加如下代碼:

<video controls autoplay src="video/preroll.mp4" width="480" height="360" 
         poster="images/prerollposter.jpg" id="video">
  1. controls 屬性表示砰蠢,播放器會(huì)提供控件潭流,允許用戶控制視頻和音頻的播放拆宛。
  2. autoplay 屬性表示一旦加載視頻就開始播放。
  3. src 代表視頻源位置
  4. poster 表示如果不設(shè)置autoplay的話,在開始播放之前贡这,視頻顯示的圖片
  5. loop 屬性會(huì)使視頻播放結(jié)束后自動(dòng)的重新開始丽惭。
  6. preload 通常用來細(xì)粒度的控制如何加載視頻來實(shí)現(xiàn)優(yōu)化湃望。如果把preload設(shè)置為none,則在用戶播放之前不下載任何視頻瞳浦。

視頻格式

  • mp4 容器官硝,包含H.264視頻和AAC音頻拔妥, MP4/H264得到了Safari和IE9+的支持缎玫,一些版本的Chrome也提供了支持。
  • WebM 容器溪王,包含VP8視頻和Vorbis音頻。 WebM由google設(shè)計(jì)用來處理VP8編碼視頻。WebM/VP8得到Firefox,Chrome和Opera的支持祝懂。webm格式的視頻擴(kuò)展名為.webm
  • Ogg 容器怜械,包含Theora視頻和Vorbis音頻蹭越。 Theora是一個(gè)開源解碼器。采用Theora編碼的視頻通常包含在Ogg文件中教届,文件擴(kuò)展名為.ogv 响鹃。 Ogg/Theora得到了Firefox买置, Chrome和Opera的支持。

如何處理這些視頻格式

1家夺。我們可以在<video>元素中對(duì)應(yīng)每種格式使用一個(gè)<source>元素,這樣能提供一組視頻板壮,每個(gè)視頻分別有自己的格式,可以讓瀏覽器選擇它支持的第一種格式合住。

<video id = "video" poster="video/prerollposter.jpg" controls width="480" height="360">
      <source src="video/preroll.mp4">
      <source src="video/preroll.webm">
      <source src="video/preroll.ogv">
      <p>Sorry, 你的瀏覽器不支持這些視頻格式</p>
</video>

瀏覽器從上向下查找笨使,知道找到他能播放的一種格式卿樱。

  1. 更具體的指定視頻格式
    上面告訴瀏覽器視頻源的位置,使他能在不同版本中作出選擇硫椰。不過繁调,瀏覽器真正確定一個(gè)文件是否可以播放,還需要做一個(gè)檢測(cè)工作靶草。我們可以為瀏覽器提供更多幫組蹄胰,給出有關(guān)視頻文件的MIME類型和編碼器。
<video id = "video" poster="video/prerollposter.jpg" controls width="480" height="360">
      <source src="video/preroll.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2” '>
      <source src="video/preroll.webm" type='video/webm; codecs="vp8, vorbis" '>
      <source src="video/preroll.ogv" type='video/ogg; codecs="theota, vorbis" ’> 
      <p>Sorry, 你的瀏覽器不支持這些視頻格式</p>
</video>
  • type 是一種可選屬性奕翔,他向?yàn)g覽器提供了一個(gè)提示裕寨,幫組它確定能不能播放這種類型的文件。
  • ‘video/mp4’ 這種type類型是一種MIME類型派继,制定了容器格式,注意其單引號(hào)宾袜。
  • codecs參數(shù)指定使用哪個(gè)編解碼器對(duì)視頻和音頻編碼,來創(chuàng)建編碼的視頻文件驾窟。其中codecs="avc1.42E01E, mp4a.40.2”第一個(gè)參數(shù)表示視頻編碼器庆猫,第二個(gè)參數(shù)表示音頻編碼器。

注意:type 和codecs中的單雙引號(hào)的位置绅络。


Video在javaScript中的API

1. 調(diào)用的方法:
方法名 功能
play() 播放視頻
pause() 暫停視頻
load() 加載視頻
canPlayType 通過編程幫組你確定可以播放哪些視頻類型
2. 使用的屬性
屬性名 作用
videoWidth 播放器的寬度
videoHeight 播放器的高度
currentTime 播放的當(dāng)前時(shí)間
duration duration 屬性返回當(dāng)前音頻/視頻的長(zhǎng)度月培,以秒計(jì)
ended ended 屬性返回音頻/視頻是否已結(jié)束。
error 錯(cuò)誤原因
loop 是否可以循環(huán) 可以修改屬性
muted 當(dāng)設(shè)置該屬性后昨稼,它規(guī)定視頻的音頻輸出應(yīng)該被靜音节视。
readyState 就緒狀態(tài)指示音頻/視頻是否已準(zhǔn)備好播放。
seeking 尋址中(Seeking)指的是用戶在音頻/視頻中移動(dòng)/跳躍到新的位置假栓。
volume volume 屬性設(shè)置或返回音頻/視頻的當(dāng)前音量寻行。
3. 捕獲這些事件

下面這些是可以捕獲的事件,如果增加事件處理程序匾荆,出現(xiàn)你監(jiān)聽的事件時(shí)就會(huì)調(diào)用相應(yīng)的事件處理程序拌蜘。

事件名稱 作用
play 播放器開始播放的事件
pause 播放器開始暫停的事件
progress 當(dāng)瀏覽器正在下載指定的音頻/視頻時(shí),會(huì)發(fā)生 progress 事件牙丽。
error 當(dāng)瀏覽器播放發(fā)生錯(cuò)誤時(shí)
timeupdate timeupdate 事件在音頻/視頻(audio/video)的播放位置發(fā)生改變時(shí)觸發(fā)简卧。
ended 當(dāng)瀏覽器播放當(dāng)前視頻結(jié)束觸發(fā)
abort 該事件是在多媒體數(shù)據(jù)終止下載時(shí)觸發(fā),而不是發(fā)生錯(cuò)誤時(shí)觸發(fā)烤芦。
waiting waiting 事件在視頻由于需要緩沖下一幀而停止時(shí)觸發(fā)举娩。。
loadeddata 當(dāng)當(dāng)前幀的數(shù)據(jù)已加載,但沒有足夠的數(shù)據(jù)來播放指定音頻/視頻的下一幀時(shí)铜涉,會(huì)發(fā)生 loadeddata 事件智玻。
loadedmetadata 當(dāng)指定的音頻/視頻的元數(shù)據(jù)已加載時(shí),會(huì)發(fā)生 loadedmetadata 事件芙代。音頻/視頻的元數(shù)據(jù)包括:時(shí)長(zhǎng)吊奢、尺寸(僅視頻)以及文本軌道。
volumechange 當(dāng)瀏覽器音量發(fā)生變化時(shí)觸發(fā)纹烹。

實(shí)現(xiàn)一個(gè)視頻的播放

//js
var position = 0;   //定義一個(gè)變量來記錄我們播放的哪個(gè)視頻
var playlist;     // 保存視頻播放列表數(shù)組
var video;       //保存video元素的引用

window.onload = function() {
    playlist = ["video/preroll", 
                "video/areyoupopular", 
                "video/destinationearth"];
    video = document.getElementById('video');
    video.addEventListener("ended", nextVideo,false);  //監(jiān)聽事件

    video.src = playlist[position] + getFormatExtension();
    video.load();
    video.play();
}

function nextVideo() {
    position++;
    if (position >= playlist.length) {
        position = 0;
    }
    video.src = playlist[position] + getFormatExtension();
    video.load();
    video.play();
}

function getFormatExtension() {
    if (video.canPlayType("video/mp4") != "") {
        return ".mp4";
    } else if (video.canPlayType("video/ogg") != "") {
        return ".ogv";
    } else if (video.canPlayType("video/webm") != "") {
        return ".webm";
    }
}
  • canPlayType方法用來取一個(gè)視頻格式為參數(shù)页滚,返回一個(gè)字符串,表示瀏覽器對(duì)于播放這種類型的視頻有多大的信心铺呵。共有三個(gè)等級(jí):很可能(probably) 可能(maybe)和空裹驰。

給視頻加上特效

主要方法是利用兩層畫布來創(chuàng)建特效,上面的畫布顯示完成的特效片挂,下面的畫布來實(shí)現(xiàn)一個(gè)scratch緩沖區(qū)邦马,來操作每幀視頻的rgb顏色值。

//window.onload方法中添加事件
video.addEventListener("play", processFrame, false);  //獲取每幀視頻

function processFrame(e) {
    var video = document.getElementById("video");

    if (video.paused || video.ended) {
        return;
    }

    var bufferCanvas = document.getElementById("buffer");
    var displayCanvas = document.getElementById("display");
    var buffer = bufferCanvas.getContext("2d");
    var display = displayCanvas.getContext("2d");
        
        //緩沖區(qū)獲取畫布的大小宴卖,并且把當(dāng)前幀的視頻轉(zhuǎn)化為圖片
    buffer.drawImage(video, 0, 0, bufferCanvas.width, bufferCanvas.height);  
    var frame = buffer.getImageData(0, 0, bufferCanvas.width, bufferCanvas.height);
    var length = frame.data.length / 4;

    for (var i = 0; i < length; i++) {
        var r = frame.data[i * 4 + 0];
        var g = frame.data[i * 4 + 1];
        var b = frame.data[i * 4 + 2];
        if (effectFunction) {
            effectFunction(i, r, g, b, frame.data);  //是執(zhí)行像素轉(zhuǎn)換的方法
        }
    }
    display.putImageData(frame, 0, 0);

    setTimeout(processFrame, 0);   //設(shè)置為0是為了獲取每一幀視頻
    // try this line instead of the setTimeout above if you are on Chrome
    //requestAnimationFrame(processFrame);

}

//effectFunction方法的匿名函數(shù)
function noir(pos, r, g, b, data) {
    var brightness = (3*r + 4*g + b) >>> 3;
    if (brightness < 0) brightness = 0;
    data[pos * 4 + 0] = brightness;
    data[pos * 4 + 1] = brightness;
    data[pos * 4 + 2] = brightness;
}

function western(pos, r, g, b, data) {
    var brightness = (3*r + 4*g + b) >>> 3;
    data[pos * 4 + 0] = brightness+40;
    data[pos * 4 + 1] = brightness+20;
    data[pos * 4 + 2] = brightness-20;
    data[pos * 4 + 3] = 255; //220;
}



知行辦公,專業(yè)移動(dòng)辦公平臺(tái)https://zx.naton.cn/
【總監(jiān)】十二春秋之邻悬,3483099@qq.com症昏;
【Master】zelo,616701261@qq.com父丰;
【運(yùn)營】運(yùn)維艄公肝谭,897221533@qq.com;****
【產(chǎn)品設(shè)計(jì)】流浪貓蛾扇,364994559@qq.com攘烛;
【體驗(yàn)設(shè)計(jì)】兜兜,2435632247@qq.com镀首;
【iOS】淘碼小工坟漱,492395860@qq.comiMcG33K更哄,imcg33k@gmail.com芋齿;
【Android】人猿居士,1059604515@qq.com成翩;思路的頓悟觅捆,1217022114@qq.com
【java】首席工程師MR_W麻敌,feixue300@qq.com栅炒;
【測(cè)試】土鏡問道,847071279@qq.com
【數(shù)據(jù)】fox009521赢赊,42151960@qq.com乙漓;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市域携,隨后出現(xiàn)的幾起案子簇秒,更是在濱河造成了極大的恐慌,老刑警劉巖秀鞭,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趋观,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锋边,警方通過查閱死者的電腦和手機(jī)皱坛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豆巨,“玉大人剩辟,你說我怎么就攤上這事⊥樱” “怎么了贩猎?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萍膛。 經(jīng)常有香客問我吭服,道長(zhǎng),這世上最難降的妖魔是什么蝗罗? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任艇棕,我火速辦了婚禮,結(jié)果婚禮上串塑,老公的妹妹穿的比我還像新娘沼琉。我一直安慰自己,他們只是感情好打瘪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吸祟,像睡著了一般瑟慈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋匕,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天葛碧,我揣著相機(jī)與錄音,去河邊找鬼过吻。 笑死进泼,一個(gè)胖子當(dāng)著我的面吹牛蔗衡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乳绕,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼绞惦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了洋措?” 一聲冷哼從身側(cè)響起济蝉,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菠发,沒想到半個(gè)月后王滤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滓鸠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年雁乡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糜俗。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踱稍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悠抹,到底是詐尸還是另有隱情珠月,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布楔敌,位于F島的核電站桥温,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梁丘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一旺韭、第九天 我趴在偏房一處隱蔽的房頂上張望氛谜。 院中可真熱鬧,春花似錦区端、人聲如沸值漫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨何。三九已至,卻和暖如春沥邻,著一層夾襖步出監(jiān)牢的瞬間危虱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工唐全, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留埃跷,地道東北人蕊玷。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弥雹,于是被迫代替她去往敵國和親垃帅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 視頻編碼格式全面解析 我們?cè)谠斀飧鞣N主流的視頻格式之前剪勿,先拋開各種視頻格式的定義贸诚,來討論這樣一件事情:你覺得目前的...
    latthias閱讀 21,217評(píng)論 2 30
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件厕吉、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,106評(píng)論 4 62
  • 在機(jī)場(chǎng)送走林勵(lì)凡酱固,我搭乘公交車回家,車上有一家三口赴涵,兩個(gè)大人看起來年紀(jì)不過三十歲上下媒怯,面上流露的是都市里難以邂逅的...
    雪茸閱讀 290評(píng)論 0 0