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>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容