html5之音頻視頻詳解

html5已經為我們提供了音頻和視頻的控制讓我們不必在依賴于Flash。本次我將為大家講解html5的音頻和視頻操作以及利用工具對音頻和視頻進行編碼操作以適應不同的瀏覽器使用不同的音頻視頻文件。好的,進入我們的正題。開飯。。。。

html5的音頻Audio

html5規定了在網頁上嵌入音頻元素的標準,即使用 <audio> 元素。audio功能上已經非常強大,回放,跳轉,緩沖等以前只能用flash才能實現的功能,html5的audio都能輕松搞定。

1.audio標簽屬性

src:音樂的URL
preload:預加載
autoplay:自動播放
loop:循環播放
controls:瀏覽器自帶的控制條

2.控制函數功能說明

load(): 加載音頻、視頻軟件,通常不必調用,除非是動態生成的元素,用來在播放前預加載。
play() : 加載并播放音頻、視頻文件,除非文件已經暫停在其他位置,否則默認重頭開始播放。
pause() :暫停處于播放狀態的音頻、視頻文件。
canPlayType():檢測瀏覽器是否能播放指定的音頻/視頻類型
addTextTrack():向音頻/視頻添加新的文本軌道

3.只讀屬性屬性說明

duration :獲取媒體文件的播放時長,以s為單位,如果無法獲取,則為NaN。
paused :如果媒體文件被暫停,則返回true,否則返回false。
ended :如果媒體文件播放完畢,則返回true。
startTime :返回起始播放時間,一般是0.0,除非是緩沖過的媒體文件,并且一部分內容已經不在緩沖區。
error : 在發生了錯誤后返回的錯誤代碼。
currentSrc : 以字符串形式返回正在播放或已加載的文件,對應于瀏覽器在source元素中選擇的文件。

4.可腳本控制的特性值

autoplay:自動播放已經加載的的媒體文件,或查詢是否已設置為autoplay
loop:將媒體文件設置為循環播放,或查詢是否已設置為loop
currentTime:以s為單位返回從開始播放到目前所花的時間,也可設置currentTime的值來跳轉到特定位置
controls: 顯示或者隱藏用戶控制界面
volume:在0.0到1.0間設置音量值,或查詢當前音量值
muted:設置是否靜音
autobuffer:媒體文件播放前是否進行緩沖加載,如果設置了autoplay,則忽略此特性

注意:對于這些屬性,主流的瀏覽器都支持。可是別以為就沒有了兼容性,在音頻播放流中,有兩個陣營。firefox 和 opera 支持 ogg 音頻,safari 和 ie 支持 mp3.幸好Google的chrome都支持。
代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>audio</title>
</head>
<body>
    <a href="javascript:void(0);" onclick="getCurrentTime('firefox');">獲取播放時間</a>
    <a href="javascript:void(0);" onclick="playOrPaused('firefox',this);">播放</a>
    <a href="javascript:void(0);" onclick="hideOrShowControls('firefox',this);">隱藏控制框</a>
    <a href="javascript:void(0);" onclick="muted('firefox',this);">開啟靜音</a>
    <input type="button" value="+" id="upVol" onclick="vol('firefox' , 'up' , this )"/>音量<input type="button" value="-" onclick="vol('firefox' , 'down' ,this )"/>
    <audio src="薛之謙 - 剛剛好.mp3" id="audio" controls="controls" ></audio>
    當前音量:<span  id = "nowVol"> - </span>
</body>
<script>
    var audio ;
    window.onload = function(){
        initAudio();
    }
    var initAudio = function(){
        //audio =  document.createElement("audio")
        //audio.src='Never Say Good Bye.ogg'
        audio = document.getElementById('audio');
    }
    function getCurrentTime(id){            
        alert(parseInt(audio.currentTime) + ':秒');
    }
    
    function playOrPaused(id,obj){
        if(audio.paused){
            audio.play();
            obj.innerHTML='暫停';
            return;
        }
        audio.pause();
        obj.innerHTML='播放';
    }
    
    function hideOrShowControls(id,obj){
        if(audio.controls){
            audio.removeAttribute('controls');
            obj.innerHTML = '顯示控制框'
            return;
        }
        audio.controls = 'controls';
        obj.innerHTML = '隱藏控制框'
        return;
    }
    function vol(id,type , obj){
        if(type == 'up'){
            var volume = audio.volume  + 0.1;
            if(volume >=1 ){
                volume = 1 ;
            
            }
            audio.volume =  volume;
        }else if(type == 'down'){
            var volume = audio.volume  - 0.1;
            if(volume <=0 ){
                volume = 0 ;
            }
            audio.volume =  volume;
        }
        document.getElementById('nowVol').innerHTML = returnFloat1(audio.volume);
    }
    function muted(id,obj){
        if(audio.muted){
            audio.muted = false;
            obj.innerHTML = '開啟靜音';
        }else{
            audio.muted = true; 
            obj.innerHTML = '關閉靜音';
        }
    }
     //保留一位小數點
    
    function returnFloat1(value) {    
        value = Math.round(parseFloat(value) * 10) / 10;
        if (value.toString().indexOf(".") < 0){
            value = value.toString() + ".0";
        }
        return value;
    }
</script>
</html>

效果:


audio_1.png

audio_2.png

audio_3.png

audio_4.png

有時候我們為了解決兼容性問題會和<source>標簽配合使用,<source>標簽可以有多個,當瀏覽器不支持的時候會往下執行,找尋一個可以執行的,如果沒有則顯示默認的效果。代碼如下:

<audio controls>
  <source src="horse.ogg" type="audio/ogg">
  <source src="horse.mp3" type="audio/mpeg">
  您的瀏覽器不支持 audio 元素。
</audio>

html5的視頻video

<video> 標簽定義視頻,比如電影片段或其他視頻流。
提示:可以在開始標簽和結束標簽之間放置文本內容,這樣老的瀏覽器就可以顯示出不支持該標簽的信息。

1.video的標簽屬性

src:視頻的URL
poster:視頻封面,沒有播放時顯示的圖片
preload:預加載
autoplay:自動播放
loop:循環播放
controls:瀏覽器自帶的控制條
width:視頻寬度
height:視頻高度

2.video的控制函數

load(): 加載音頻、視頻軟件,通常不必調用,除非是動態生成的元素,用來在播放前預加載。
play() : 加載并播放音頻、視頻文件,除非文件已經暫停在其他位置,否則默認重頭開始播放。
pause() :暫停處于播放狀態的音頻、視頻文件。
canPlayType():檢測瀏覽器是否能播放指定的音頻/視頻類型
addTextTrack():向音頻/視頻添加新的文本軌道

3.video的常用屬性

currentSrc:返回當前音頻/視頻的 URL
currentTime:設置或返回音頻/視頻中的當前播放位置(以秒計)
duration:返回當前音頻/視頻的長度(以秒計)
ended:返回音頻/視頻的播放是否已結束
error:返回表示音頻/視頻錯誤狀態的 MediaError 對象
paused:設置或返回音頻/視頻是否暫停
muted:設置或返回音頻/視頻是否靜音
seeking:返回用戶是否正在音頻/視頻中進行查找
volume:設置或返回音頻/視頻的音量
height: 返回當前視頻的高度
width:返回當前視頻的寬度
注釋:在所有屬性中,只有 videoWidth 和 videoHeight 屬性是立即可用的。在視頻的元數據已加載后,其他屬性才可用。

3.video的常用監聽事件

onabort:在退出時運行的腳本。
oncanplay:當文件就緒可以開始播放時運行的腳本(緩沖已足夠開始時)。
oncanplaythrough:當媒介能夠無需因緩沖而停止即可播放至結尾時運行的腳本。
ondurationchange:當媒介長度改變時運行的腳本。
onemptied:當發生故障并且文件突然不可用時運行的腳本(比如連接意外斷開時)。
onended:當媒介已到達結尾時運行的腳本(可發送類似“感謝觀看”之類的消息)。
onerror:當在文件加載期間發生錯誤時運行的腳本。
onloadeddata:當媒介數據已加載時運行的腳本。
onloadedmetadata:當元數據(比如分辨率和時長)被加載時運行的腳本。
onloadstart:在文件開始加載且未實際加載任何數據前運行的腳本。
onpause:當媒介被用戶或程序暫停時運行的腳本。
onplay:當媒介已就緒可以開始播放時運行的腳本。
onplaying:當媒介已開始播放時運行的腳本。
onprogress:當瀏覽器正在獲取媒介數據時運行的腳本。
onratechange:每當回放速率改變時運行的腳本(比如當用戶切換到慢動作或快進模式)。
onreadystatechange:每當就緒狀態改變時運行的腳本(就緒狀態監測媒介數據的狀態)。
onseeked:當 seeking 屬性設置為 false(指示定位已結束)時運行的腳本。
onseeking:當 seeking 屬性設置為 true(指示定位是活動的)時運行的腳本。
onstalled:在瀏覽器不論何種原因未能取回媒介數據時運行的腳本。
onsuspend:在媒介數據完全加載之前不論何種原因終止取回媒介數據時運行的腳本。
ontimeupdate:當播放位置改變時(比如當用戶快進到媒介中一個不同的位置時)運行的腳本。
onvolumechange:每當音量改變時(包括將音量設置為靜音)時運行的腳本。
onwaiting:當媒介已停止播放但打算繼續播放時(比如當媒介暫停已緩沖更多數據)運行腳本
代碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>Video step2</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
    <video id="myVideo" controls preload="auto" width=300 height="165" 
    poster="http://img0.ph.126.net/I10JqUUJDmlEtE_XYl4hOg==/6608842237655242020.jpg" 
    src="http://www.w3cschool.cc/try/demo_source/mov_bbb.mp4">
    </video>
  <button onclick="play()">播放</button> 
  <button onclick="pause()">暫停</button> 
  <button onclick="makeBig()">放大</button>
  <button onclick="makeSmall()">縮小</button>
  <button onclick="makeNormal()">普通</button>
<script>
//獲取video元素
var myVideo = document.getElementById('myVideo'),tol = 0;
myVideo.addEventListener("loadedmetadata", function(){
    tol = myVideo.duration;//獲取總時長
});
//播放
function play(){ 
    myVideo.play();
}
//暫停
function pause(){ 
    myVideo.pause();
}
//播放時間點更新時
myVideo.addEventListener("timeupdate", function(){
    var currentTime = myVideo.currentTime;//獲取當前播放時間
    console.log(currentTime);//在調試器中打印
});
//設置播放點
function playBySeconds(num){ 
    myVideo.currentTime = num;
}
//音量改變時
myVideo.addEventListener("volumechange", function(){
    var volume = myVideo.volume;//獲取當前音量
    console.log(volume);//在調試器中打印
});
//設置音量
function setVol(num){ 
    myVideo.volume = num;
}
//放大
function makeBig()
{ 
   myVideo.width=560; 
} 
//縮小
function makeSmall()
{ 
  myVideo.width=320; 
} 
//恢復
function makeNormal()
{ 
  myVideo.width=420; 
} 
</script>
</body>
</html>

效果:


video.png

video也可以使用<source>標簽進行兼容性調試。代碼如下:

<video width="320" height="240" controls>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
   您的瀏覽器不支持Video標簽。
</video> 

編解碼工具FFmpeg

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec里很多code都是從頭開發的。
ffmpeg官網下載windows版本。本文寫作時只是直接下載了已經編譯好的ffmpeg.exe來進行相關操作,沒有涉及到ffmpeg在windows下的編
譯。首先在D盤創建ffmpeg目錄,將下載好的ffmpeg.exe文件拖入該文件夾中,并放入測試視頻1.mov。
進入 cmd ,輸入 D: 進入d盤 ,
輸入 cd ffmpeg 進入 ffmpeg 目錄
輸入 ffmpeg.exe -i D:\ffmpeg\1.mov -ar 44100 -r 29.97 -s 1280x720 D:\ffmpeg\1.mp4 即可完成轉換。
轉換需要一定的時間。
詳細教程請參照:FFmpeg快速入門

感謝大家的觀看,學習在于練習,希望大家多多練習!一起加油

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容