HTML 5 多媒体

HTML 5 多媒体

在HTML4.01时候想插入音频,视频,必须借助flash,

1. 视频音频了解

1.1. 主流的视频文件格式
  1. MPEG-4: 通常以.mp4为扩展名
  2. Flash视频: 通常以.flv为扩展名
  3. Ogg: 通常以.ogv为扩展名
  4. WebM: 通常以.webm为扩展名
  5. 音频视频交错: 通常以.avi为扩展名
1.2 音频格式:
  1. Ogg .ogg
  2. MP3 .mp3
  3. ACC .acc
1.3 编码器

音频和视频编码/解码是一种算法, 用来对于一段特定的视频或音频进行解码和编码,以便音频和视频能够播放,原始的媒体文件体积非常巨大,如果不对其进行编码,那么数据量是非常惊人的,在互联网上传播则要耗费的时间是无法忍受的, 如果不对其进行解码,就无法将编码后的数据重组为原始的媒体资源

1. 视频编解码器
  1. H.264
  2. VP8 (google开源)
  3. Ogg Theora
2. 音频编解码器
  1. AAC
  2. MPEG-3
  3. Ogg Vorbis

H.264: 别名MPEG-4, 由MPEG研发并于2003年标准化,

当然也有一些编解码器是受专利了保护的, 有一些这是免费的, 例如Ogg的Vorbis音频编解码器,Ogg的Theora视频编码器也是可以免费试用的, 而想使用H.264的话就需要支付相关费用了

2. 视频音频基本使用

2.1 基本使用标签

HTML <video> 元素 用于在HTML或者XHTML文档中嵌入媒体播放器,用于支持文档内的视频播放。

HTML <audio> 元素用于在文档中嵌入音频内容。

// 视频
<video src="视频地址" controls></video> 
// 音频
<audio src="视频地址" controls></video>
  <!-- 视频有默认的宽高300*150,没有控件controls视频还无法播放,只能看到画面 -->
  <video src="./video/这一路.mp4" controls></video>
  <!-- 音频加上控件controls才能播放 -->
  <audio src="./video/zyl大欢.mp3" controls></audio>
2.2. 兼容处理
标签的兼容
  <video src="./video/这一路.mp4" controls>当前浏览器不支持video,请更新浏览器或使用chrome打开</video>

由于浏览器视频格式的编辑码器不一样,导致有兼容问题,这个时候W3C为了解决这个问题,

兼容处理使用source标签

视频格式的兼容
<video>
     <!-- 罗列视频格式-->
    <source src="./dy.mp4" type="video/mp4">
    <source src="./dy.ogg" type="video/ogg">
   
    你的浏览器不支持video标签,<a href="./dy.map4">点击下载视频</a>
</video>
<!-- 视频格式的兼容 -->
  <video width="600" height="300" controls>    
    <source src="./video/这一路.ogv" type="video/ogg">
    <source src="./video/这一路.mp4" type="video/mp4">
  </video>
音频兼容
<audio>
    <source src="./dy.mp3" type="audio/mp4">
    <source src="./dy.ogg" type="audio/ogg">
    你的浏览器不支持audio标签,<a href="./dy.map3">点击下载音频</a>
</audio>

3. Video 视频标签

3.1 Video 标签属性
  1. src 视频url地址
  2. . width 设置播放器宽度
  3. . height 设置播放器高度
  4. .controls 向用户显示播放控件。controls是布尔值,有值就是true,即使controls="false",字符串"false"转成布尔值也是true。没有controls这个属性才是false
  5. autoplay 视频就绪自动播放。
  6. muted 视频静音
  7. loop 播放完是否继续播放该视频,循环播放
  8. poster 加载等待的画面图片
  9. preload 是否需要预加载
  10. autobuffer 设置为浏览器缓冲方式,不设置autoplay才有效
 <video 
        width="1000" 
        height="300" 
        src="./dy.mp4" 
        controls 
        Preload 
        Poster='../1.jpg'
  > 你的浏览器不支持 H5 Video 标签,请升级浏览器</video>
 <!-- 只有无声静音的情况下,autoplay才可以起作用,之前有声音也自动播放,会被吓一跳 -->
  <video width="600" height="300"  src="./video/这一路.mp4"  controls autoplay muted loop></video>
<!-- poster加载等待的画面图片,相当于视频的封面,也可以用gif动态图。preload视频没播放就已经加载-->
  <video width="600" height="300"  src="./video/这一路.mp4"  controls poster="./images/222.jpg"  preload></video>  
3.2. Video API方法(JS操控DOM元素的方法)
  1. play() 开始播放视频

  2. pause() 停止播放视频

  3. load() 重新加载媒体(比如用sourch换资源了)

  4. 全屏:

    webkit element.webkitRequestFullScreen();
    Firefox element.mozRequestFullScreen();
    W3C element.requestFullscreen(); //官方的

  5. 退出全屏:
    webkit document.webkitCancelFullScreen();
    Firefox document.mozCancelFullScreen();
    W3C document.exitFullscreen();

<body>
  <!-- 用js操控属性,js操控要有一个id或者获取元素-->
  <video id="video" width="600" height="300" src="./video/这一路.mp4" controls></video>
  <div> <button id="play">播放</button>
    <button id="pause">暂停</button>
    <button id="reload">重新加载</button>
    <button id="all">全屏</button>
    <button id="close">退出全屏</button>
  </div>
  <script>
    play.onclick = function () {
      video.play()  //没有使用video的原生控件,自己写的按钮调用Video的API方法  播放
    }
    pause.onclick = function () {
      video.pause()  //没有使用video的原生控件,自己写的按钮调用Video的API方法 暂停
    }
    reload.onclick = function () {
      video.src = "./video/第三套古诗韵律操.mp4"
      video.load()  //没有使用video的原生控件,自己写的按钮调用Video的API方法  重新加载
    }
    all.onclick = function () {
      video.requestFullscreen() //全屏
    }
    close.onclick = function () {
      video.exitFullscreen() //退出全屏
    }
  </script>
</body>
3.3. Video API属性(JS操控DOM元素的属性)
  1. currentTime : 开始到播放现在所用的时间(单位是秒) 可读可写
  2. duration : 媒体总时间(只读)
  3. volume : 0.0-1.0的音量相对值 可读可写
  4. muted : 是否静音 false /true
  5. paused : 媒体是否暂停(只读)
  6. ended : 媒体是否播放完毕(只读)
  7. error : 媒体发生错误的时候,返回错误代码 (只读)
  8. currentSrc : 以字符串的形式返回媒体地址(只读)
  9. poster: 视频播放前的预览图片(可读写)
  10. videoWidth, videoHeight: 视频实际的尺寸(只读)
btn.onclick = function () {
    box.innerHTML = `
        当前播放时间:${video.currentTime}<br/>
        总时间:${video.duration}<br/>
        音量:${video.volume}<br/>
        是否静音:${video.muted}<br/>
        是否暂停:${video.paused}<br/>
        是否播放完毕:${video.ended}<br/>
        是否发生错误:${video.error}<br/>
        地址:${video.currentSrc}`;
}
<body>
  <!-- 用js操控属性,js操控要有一个id或者获取元素-->
  <video id="video" width="600" height="300" src="./video/这一路.mp4" controls poster="./video/hs.jpg"></video>
  <div> <button id="play">播放</button>
  </div>
  <div id="info"></div>
  <script>
    // 默认控制器可能存在兼容问题,多浏览器可能不兼容、每个浏览器控件的长相也不一样,不统一,所以有时要自定义控制器,不使用默认的控件。
    play.onclick = function () {
      video.currentTime = 60   //video.currentTime属性的值是可读可写的
      video.volume = .2 //video.volume属性的值是可读可写的
      info.innerHTML = `视频播放时间:${video.currentTime}<br/>
        视频总时长:${video.duration}<br/>
        视频声音:${video.volume}<br/>
        是否静音:${video.muted}<br/>
        是否暂停:${video.paused}<br/>
        是否播放完毕:${video.ended}<br/>
        是否发生错误:${video.error}<br/>
        地址:${video.currentSrc}<br/>
        预览图:${video.poster}<br/>
        视频宽:${video.videoWidth}<br/>
        视频高:${video.videoHeight}`
    }
  </script>
</body>
3.4 . video视频基本事件
  1. onplay 视频播放时触发的事件
  2. onpause 视频暂停时触发的事件
  3. ontimeupdate 视频在播放时持续触发是事件
  4. onended 视频播放结束时触发的事件
<body>
  <!-- 用js操控属性,js操控要有一个id或者获取元素-->
  <video id="video" width="600" height="300" src="./video/这一路.mp4" controls></video>
  <script>
    video.onplay = function () {
      console.log('我播放了')
    }
    video.onpause = function () {
      console.log('我暂停了')
    }
    video.ontimeupdate = function () {
      console.log('我一直在播放')
    }
    video.onended = function () {
      console.log('我播放完了,你过来啦')
    }
  </script>
</body>

4. audio 音频标签

4.1 audio 标签属性
  1. src 要播放的音频的 URL。
  2. . autoplay 自动播放
  3. controls 向用户显示播放控件
  4. loop 循环
  5. preload 是否等加载完再播放
  6. muted 静音
4.2. audio API属性
  1. duration 音乐的总时间(只读)
  2. currentTime 音乐当前时间(可读写)
  3. volume: 0-1 的音量绝对值(可读写)
  4. ended 音乐播是否播放完毕(只读)
  5. play: 音乐播放(只读)
  6. pause:音乐暂停(只读)
  7. error: 媒体发生错误的时候,返回错误代码(只读)
  8. currentSrc: 以字符串的形式返回媒体地址(只读)_

自定义视频播放器

<body>
  <div id="wrap">
    <video id="video" width="500" height="300" poster="./resource/333.jpg">
      <source src="./video/这一路.mp4" type="video/mp4" />

      <source src="./video/这一路.ogv" type="video/ogg" />

      您的浏览器不支持video标签,请您升级或更换浏览器!!
    </video>
    <div style="height:10px;background:-webkit-linear-gradient(top,#333,#555)"></div>
    <div id="progress">
      <input id="currTime" type="text" value="00:00:00">
      <div class="pro">
        <div class="pro-bg"></div>
        <div class="pro-bar"></div>
      </div>
      <input id="allTime" type="text" value="00:00:00">
    </div>
    <div id="control">
      <a id="pre" href="javascript:;"></a>
      <a id="play" href="javascript:;"></a>
      <a id="next" href="javascript:;"></a>
      <a id="volume" href="javascript:;">
        <p class="vol">
          <span class="vol-bg"></span>
          <span class="vol-bar"></span>
        </p>
      </a>
      <a id="full" href="javascript:;"></a>
    </div>
  </div>
  <script>
    //获取操作的元素
    //JS中没有连字符-,要么改成下划线_,要么改成驼峰
    let oVide = getById('video'),
      play = getById('play'),
      pre = getById('pre'),
      next = getById('next'),
      volume = getById('volume'),
      full = getById('full'),
      currTime = getById('currTime'),
      allTime = getById('allTime'),
      pro = getByClass('pro'),
      pro_bg = getByClass('pro-bg'),
      pro_bar = getByClass('pro-bar'),
      vol_bg = getByClass('vol-bg'),
      vol_bar = getByClass('vol-bar');
    //视频播放/暂停按钮
    // 借助信号量控制播放暂停
    let mark = true;
    play.onclick = function () {
      if (mark) {
        console.log('播放');
        oVide.play();
        this.style.backgroundPosition = "-40px 0";
      } else {
        console.log('暂停')
        oVide.pause()
        this.style.backgroundPosition = "0 0"
      }
      mark = !mark;
      // 获取视频总时长
      // console.log(oVide.duration)
      allTime.value = formaTime(oVide.duration)
    }
    //当前视频播放时间
    oVide.addEventListener('timeupdate', function () {//监听timeupdate事件,触发事件处理函数
      getCurrentTime()
      // console.log(this.currentTime)
    }, false)

    //处理当前时间与进度
    function getCurrentTime() {
      currTime.value = formaTime(oVide.currentTime)
      // 进度条
      // 计算当前视频播放的比例
      let decimal = oVide.currentTime / oVide.duration//播放小数比等于播放的时长除以总时长
      pro_bar.style.left = decimal * (pro.offsetWidth - pro_bar.offsetWidth) + 'px'//小球定位定位等于播放小数比乘以容器的宽度减去小球的宽度
      //进度条背景的移动
      pro_bg.style.width = 20 + decimal * (pro.offsetWidth - pro_bar.offsetWidth) + 'px'
    }
    function formaTime(time) {//定义格式化时间函数formaTime()  forma表示格式化。转成 时:分:秒
      time = time && +time;//有可能是null或字符串,不存在就是null 字符串就转成数字类型,所以使用逻辑与
      let hh = formatZero(Math.floor(time / 3600))//获得小时
      let mm = formatZero(Math.floor(time % 3600 / 60))//获得分钟
      let ss = formatZero(Math.floor(time % 60))//获得秒
      // console.log('time',hh,mm,ss)//把这个时间渲染到页面上
      return `${hh}:${mm}:${ss}`
    }
    //两位数字函数(时间变成两位)
    function formatZero(num) {
      return (num > 10 ? "" : "0") + num //得到空或者0后拼接num
    }
    //进度条的拖拽  
    pro_bar.onmousedown = function (ev) {
      ev = ev || window.event;

      let disX = ev.clientX - this.offsetLeft;//差值
      //鼠标移动
      document.onmousemove = function (ev) {
        ev = ev || window.event;
        let _left = ev.clientX - disX;
        //边界检测
        if (_left <= 0) {//最小值
          _left = 0;
        }
        if (_left >= pro.offsetWidth - pro_bar.offsetWidth) { //最大值
          _left = pro.offsetWidth - pro_bar.offsetWidth
        }
        //设置进度条移动
        pro_bar.style.left = _left + 'px'
        //设置进度条移动
        pro_bg.style.width = 20 + _left + 'px';
        //计算拖拽百分比小数
        let processDecimal = _left / (pro.offsetWidth - pro_bar.offsetWidth)  //距离除以总长
        // 计算当前时间
        oVide.currentTime = processDecimal * oVide.duration// 小数乘以总时长
      }
      getCurrentTime()//再执行处理当前时间与进度函数
      //鼠标抬起
      document.onmouseup = function () {
        document.onmousemove = null
        document.onmouseup = null;
      }
    }
    // 全屏
    full.onclick = function () {
      oVide.webkitRequestFullScreen()
    }
    //通过id获取DOM元素方法
    function getById(id) {
      return document.getElementById(id)
    }
    function getByClass(className) {
      return document.getElementsByClassName(className)[0]//只要一个元素
    }
  </script>
</body>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容