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阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容