h5音頻和視頻

標(biāo)簽

  • audio video
  • source

<video>

視頻容器

  • 容器文件啰扛,類似于壓縮了一組文件
    --音頻軌道
    --視頻軌道
    --元數(shù)據(jù):封面,標(biāo)題鞍帝,字幕等
    --格式:.avi煞茫、.flv、.mp4宵膨、.mkv辟躏、.ogv等

媒體元素

  • controls 顯示或隱藏用戶控制界面
    默認(rèn)情況下這些控件是不顯示的会涎,所以需要設(shè)置controls來顯示控件:
    <audio controls src="a.mp4"></audio>
  • autoplay 媒體是否自動(dòng)播放
  • loop 媒體是否循環(huán)播放
  • currentTime 從開始到播放現(xiàn)在所用的時(shí)間
  • duration 媒體總時(shí)間(只讀)
  • volume 0.0~1.0的音量相對(duì)值
  • muted 是否靜音
  • autobuffer 開始的時(shí)候是否緩沖加載末秃,autoplay的時(shí)候练慕,忽略此屬性

音頻和視頻

編解碼器(瀏覽器中內(nèi)嵌了一個(gè)叫做編解碼器的東西)

  • 原始的視頻容器非常大铃将,添加需編碼劲阎,播放需解碼
  • 音頻編解碼器:AAC鸠真、MPEG-3吠卷、OggVorbis
  • 視頻編解碼器:H.264VP8偎捎、OggTheora
source的作用與用法:
<video controls>
  <source src="aaa.ogv"></source>
  <source src="aaa.mp4"></source>
</video>

上述代碼中,先加載aaa.ogv格式的文件程奠,如果瀏覽器不支持ogv格式瞄沙,就加載后面的aaa.mp4,以此類推申尼,所以source的作用不言而喻了吧师幕。

currentTime

播放過程中可以實(shí)時(shí)獲取當(dāng)前播放了多長(zhǎng)時(shí)間

<audio :src="w" id="a1" controls autoplay></audio>
var oA = document.getElementById("a1")
setInterval(function () {
  console.log(oA.currentTime)
}, 1000)


可以看到霹粥,瀏覽器也并不是隔整一秒執(zhí)行的......
currentTime不僅可以讀取后控,還可以設(shè)置(可讀寫
eg:設(shè)置媒體元素從60秒處開始播放:

oA.currentTime = 60
duration
var oA = document.getElementById("a1")
console.log(oA.duration)

直接這么獲取到audio元素然后打印其duration浩淘,結(jié)果很可能是NaN吴攒,可以理解為沒來得及獲取媒體元素加載的時(shí)長(zhǎng),如果這里給設(shè)置一個(gè)延遲再打印欣鳖,是可以獲取到duration的泽台。
當(dāng)歌曲準(zhǔn)備到可以被播放時(shí)矾缓,才進(jìn)行獲取duration和buffered等相關(guān)數(shù)據(jù)獲取操作嗜闻。

媒體元素_2

  • paused 媒體是否暫停(只讀
  • ended 媒體是否播放完畢(只讀
  • error 媒體發(fā)生錯(cuò)誤的時(shí)候,返回的錯(cuò)誤代碼(只讀
  • currentSrc 以字符串的形式返回媒體地址(只讀
  • play() 媒體播放
  • pause() 媒體暫停
  • load() 重新加載媒體
load()

比如在js中改變了媒體元素的src样眠,這時(shí)是需要重新加載媒體元素:

<video controls>
  <source src="aaa.ogv"></source>
</video>
......
as[0].src = "aaa.mp4"
oV.load()

媒體元素_3

事件:loadstart progress suspend emptied stalled play pause loadedmetadata loadeddata waiting playing canplay canplaythrough seeking seeked timeupdate ended ratechange durationchange volumechange

媒體相關(guān)事件

<video controls id="ov">
  <source :src="w"></source>
</video>
var oV = document.getElementById("ov")
oV.addEventListener("ended", function () {
  console.log("播放結(jié)束")
}, false)

文件播放結(jié)束時(shí)檐束,控制臺(tái)打印“播放結(jié)束”被丧。

video額外特性

  • poster:視頻播放前的預(yù)覽圖片
//某vue文件------------------------------------------------------
<video controls id="ov">
  <source :src="w"></source>
</video>
......
import pic from "@/assets/logo.png" 
data(){
  return {
    pic
  }
}
......
mounted(){
  var oV = document.getElementById("ov")
  oV.poster = pic
}

這里我是在vue+webpack項(xiàng)目中進(jìn)行的實(shí)踐,在webpack中一切都是模塊柿究,所以在要正確加載出圖片文件蝇摸,html中是將圖片解碼成了base64探入,因此這里使用模塊的思想把圖片引入然后賦值給video的poster蜂嗽。
在常規(guī)html中引入方式一般為:oV.poster="../assets/logo.png"

  • width height:設(shè)置視頻的尺寸
<video controls id="ov" poster="../assets/logo.png">
  <source :src="w"></source>
</video>
var oV = document.getElementById("ov")
oV.width = 800
oV.height = 700
  • videoWidth videoHeight:視頻的實(shí)際尺寸(只讀)
    視頻最原始的大小植旧,不論被設(shè)置成多大尺寸,這個(gè)原始大小是不會(huì)變的

練習(xí)1:帶聲音的導(dǎo)航(部分代碼)

<ul id="ul1">
  <li au="a">1</li>
  <li au="b">2</li>
  <li au="c">3</li>
  <li au="d">4</li>
  <li au="e">5</li>
  <li au="f">6</li>
  <li au="g">7</li>
</ul>
<audio src="" id="a1"></audio>
var oUl = document.getElementById("ul1")
var aLi = oUl.getElementsByTagName("li")
var oA = document.getElementById("a1")
for(var i=0;i<aLi.length;i++){
  aLi[i].onmouseover = function () {
    console.log(this.getAttribute("au"))
    oA.src = "http://yinjie/yuefu/"+this.getAttribute("au")+".mp3";
    oA.play()
  }
}

練習(xí)2:把視頻以canvas方式輸出(部分代碼)

<video controls id="v1">
  <source :src="aaa"></source>
</video>
<canvas id="c1"></canvas>
var oV = document.getElementById("v1")
var oC = document.getElementById("c1")
var oGc = oC.getContext("2d")
//canplay
//在媒體數(shù)據(jù)已經(jīng)有足夠的數(shù)據(jù)(至少播放數(shù)幀)可供播放時(shí)觸發(fā)
//否則直接是獲取不到videoWidth這種數(shù)據(jù)的
oV.addEventListener("canplay", function () {
  oC.width = oV.videoWidth
  oC.height = oV.videoHeight
  console.log(oV.videoWidth, oV.videoHeight)
}, false)
setInterval(function () {
  oGc.drawImage(oV, 0, 0)
  //另外還可以進(jìn)行其他像素級(jí)操作
}, 30)

練習(xí)3:自制播放器(部分代碼)
功能:播放/暫停、播放時(shí)間實(shí)時(shí)顯示嵌戈、全屏熟呛、靜音(每個(gè)功能基本上都是相對(duì)獨(dú)立的,沒有做互相影響的處理)

<video controls id="v1">
  <source :src="aaa"></source>
</video>
<input type="button" value="播放"/>
<input type="text" value="00:00:00" readonly/> <!--實(shí)時(shí)播放時(shí)間顯示-->
<input type="text" value="00:00:00" readonly/> <!--播放總時(shí)長(zhǎng)-->
<input type="button" value="靜音"/> 
<input type="button" value="全屏"/>
var oV = document.getElementById("v1")
var oInput = document.getElementsByTagName("input")

var timer = null //計(jì)時(shí)器
var oDuration = null //媒體總時(shí)長(zhǎng)

oV.addEventListener("canplay", function () {
  oV.width = 250 //視頻原始大小太大吗冤,設(shè)置寬高
  oV.height = 500
  oDuration = oV.duration
  oInput[2].value = changeTime(oDuration) //設(shè)置總播放時(shí)長(zhǎng)
                                          //設(shè)置總播放時(shí)長(zhǎng)要放在canplay里面椎瘟,放在外面獲取到的oDuration可能是空
}, false)

oInput[0].onclick = function () { //第一個(gè)按鈕控制播放和暫停
  if(oV.paused){
    oV.play()
    this.value = "暫停"
    nowTime()
    timer = setInterval(nowTime, 1000)
  }
  else {
    oV.pause()
    this.value = "播放"
    clearInterval(timer)
  }
}
function changeTime(iNum){ //總播放時(shí)長(zhǎng)轉(zhuǎn)換為時(shí)分秒
  iNum = parseInt(iNum)
  var iH = toZero(Math.floor(iNum/3600)); //時(shí)
  var iM = toZero(Math.floor(iNum%3600/60));
  var iS = toZero(Math.floor(iNum%60));
  return iH+":"+iM+":"+iS;
}
function toZero(num) { // 9--09降传,12--12
  if(num<=9){
    return "0"+num
  }
  return ""+num;
}
function nowTime(){
  oInput[1].value = changeTime(oV.currentTime)
}

oInput[3].onclick = function () {
  if(oV.muted){
    oV.volume = 1
    this.value = "靜音"
    oV.muted = false //這句話一定要加
  }
  else {
    oV.volume = 0
    this.value = "取消靜音"
    oV.muted = true //這句話一定要加
                    //volume音量并不會(huì)影響muted值婆排,所以需要手動(dòng)設(shè)置
  }
}
oInput[4].onclick = function () {
  oV.webkitRequestFullScreen()
}

其中關(guān)于h5控制全屏播放段只,可參考如下博客:
張?chǎng)涡瘢篐TML5全屏API在FireFox/Chrome中的顯示差異
武方博:html5實(shí)現(xiàn)全屏的api方法

練習(xí)4:自制播放器(部分代碼)
功能:視頻進(jìn)度拖拽控制(只是做了通過拖拽控制視頻進(jìn)度鉴扫,其他的相互影響的代碼暫時(shí)未寫)

<video controls id="v1">
  <source :src="aaa"></source>
</video>
<div id="div1">  
  <div id="div2"></div>
</div>
var oV = document.getElementById("v1")
var oDiv1 = document.getElementById("div1")
var oDiv2 = document.getElementById("div2")
var oDuration = null //媒體總時(shí)長(zhǎng)
var disX = 0 //視頻進(jìn)度
oV.addEventListener("canplay", function () {
  oV.width = 250
  oV.height = 500
  oDuration = oV.duration
}, false)
oDiv1.onmousedown = function (ev) {
  var ev = ev || window.event
  disX = ev.clientX - oDiv1.offsetLeft
  oDiv2.style.width = disX + "px"
  document.onmousemove = function (ev) {
    var ev = ev || window.event
    var L = ev.clientX - oDiv1.offsetLeft
    if(L<0){
      L = 0
    }
    else if(L > oDiv1.offsetWidth){
      L = oDiv1.offsetWidth
    }
    oDiv2.style.width = L + "px"
    var scale = L / oDiv1.offsetWidth
    oV.currentTime = oDuration * scale.toFixed(2)
  }
  document.onmouseup = function () {
    document.onmousemove = null
  }
  return false
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炕婶,一起剝皮案震驚了整個(gè)濱河市莱预,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涯贞,老刑警劉巖宋渔,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜限,死亡現(xiàn)場(chǎng)離奇詭異薄嫡,居然都是意外死亡岂座,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門钾恢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘩蚪,“玉大人稿黍,你說我怎么就攤上這事巡球〉肃冢” “怎么了汹押?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵棚贾,是天一觀的道長(zhǎng)妙痹。 經(jīng)常有香客問我怯伊,道長(zhǎng)陋守,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮中燥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拿霉。我一直安慰自己绽淘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布沪铭。 她就那樣靜靜地躺著杀怠,像睡著了一般赔退。 火紅的嫁衣襯著肌膚如雪硕旗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天慧域,我揣著相機(jī)與錄音,去河邊找鬼辛藻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吱肌,可吹牛的內(nèi)容都是我干的痘拆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼氮墨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼纺蛆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起规揪,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤桥氏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后猛铅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體字支,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年奸忽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栗菜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片富俄。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翘盖,死狀恐怖阁危,靈堂內(nèi)的尸體忽然破棺而出擂煞,到底是詐尸還是另有隱情对省,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布胖齐,位于F島的核電站补履,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏麻汰。R本人自食惡果不足惜位喂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一痛倚、第九天 我趴在偏房一處隱蔽的房頂上張望嗡髓。 院中可真熱鬧饿这,春花似錦吧黄、人聲如沸奉芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至引瀑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黍特,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工劈愚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掠械,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓罩缴,卻偏偏與公主長(zhǎng)得像烙荷,于是被迫代替她去往敵國(guó)和親焰薄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 首先泞遗,我們要理解兩個(gè)概念:容器(container)和編解碼器(codec)佩伤。1.視頻容器音頻文件或視頻文件,都只...
    IT小C閱讀 1,294評(píng)論 2 5
  • 前言 早年看電影是在在線的視頻網(wǎng)站上看邀层,但是往往有些電影是需要會(huì)員或者是購(gòu)買才能看的涛目,作為一個(gè)窮學(xué)生讓我為了看一個(gè)...
    萌噠噠的小貔貅閱讀 17,463評(píng)論 1 17
  • 前言 說到視頻,大家自己腦子里基本都會(huì)想起電影磕谅、電視劇、在線視頻等等,也會(huì)想起一些視頻格式 AVI、MP4、RMV...
    ForestSen閱讀 22,821評(píng)論 10 202
  • 視頻編碼與封裝方式詳解 1.編碼方式和封裝格式 2.視頻編碼標(biāo)準(zhǔn)兩大系統(tǒng) MPEG-1 MPEG-2 MPEG-3...
    latthias閱讀 6,349評(píng)論 0 22
  • 寶寶在30-32周胎動(dòng)明顯增大,一會(huì)規(guī)律地打嗝,一會(huì)拳打腳踢,有時(shí)候媽媽都受不了,看來是個(gè)活潑愛動(dòng)的寶寶。最近渾身...
    王小蝸閱讀 190評(píng)論 0 0