Files
javascript-tutorial/docs/elements/video.md
2020-10-27 18:34:45 +08:00

10 KiB
Raw Blame History

概述

<video>元素用来加载视频,是HTMLVideoElement对象的实例。<audio>元素用来加载音频,是HTMLAudioElement对象的实例。而HTMLVideoElementHTMLAudioElement都继承了HTMLMediaElement,所以这两个 HTML 元素有许多共同的属性和方法,可以放在一起介绍。

理论上,这两个 HTML 元素直接用src属性指定媒体文件,就可以使用了。

<audio src="background_music.mp3"/>
<video src="news.mov" width=320 height=240/>

注意,<video>元素有width属性和height属性,可以指定宽和高。<audio>元素没有这两个属性,因为它的播放器外形是浏览器给定的,不能指定。

实际上,不同的浏览器支持不同的媒体格式,我们不得不用<source>元素指定同一个媒体文件的不同格式。

<audio id="music">
  <source src="music.mp3" type="audio/mpeg">  
  <source src="music.ogg" type='audio/ogg; codec="vorbis"'>
</audio>

浏览器遇到支持的格式,就会忽略后面的格式。

这两个元素都有一个controls属性,只有打开这个属性,才会显示控制条。注意,<audio>元素如果不打开controls属性,根本不会显示,而是直接在背景播放。

HTMLMediaElement 接口

HTMLMediaElement并没有对应的 HTML 元素,而是作为<video><audio>的基类,定义一些它们共同的属性和方法。

HTMLMediaElement接口有以下属性。

  • HTMLMediaElement.audioTracks返回一个类似数组的对象表示媒体文件包含的音轨。
  • HTMLMediaElement.autoplay布尔值表示媒体文件是否自动播放对应 HTML 属性autoplay
  • HTMLMediaElement.buffered返回一个 TimeRanges 对象,表示浏览器缓冲的内容。该对象的length属性返回缓存里面有多少段内容,start(rangeId)方法返回指定的某段内容从0开始开始的时间点end()返回指定的某段内容结束的时间点。该属性只读。
  • HTMLMediaElement.controls布尔值表示是否显示媒体文件的控制栏对应 HTML 属性controls
  • HTMLMediaElement.controlsList返回一个类似数组的对象表示是否显示控制栏的某些控件。该对象包含三个可能的值nodownloadnofullscreennoremoteplayback。该属性只读。
  • HTMLMediaElement.crossOrigin字符串表示跨域请求时是否附带用户信息比如 Cookie对应 HTML 属性crossorigin。该属性只有两个可能的值:anonymoususe-credentials
  • HTMLMediaElement.currentSrc字符串表示当前正在播放的媒体文件的绝对路径。该属性只读。
  • HTMLMediaElement.currentTime浮点数表示当前播放的时间点。
  • HTMLMediaElement.defaultMuted布尔值表示默认是否关闭音量对应 HTML 属性muted
  • HTMLMediaElement.defaultPlaybackRate浮点数表示默认的播放速率默认是1.0。
  • HTMLMediaElement.disableRemotePlayback布尔值是否允许远程回放即远程回放的时候是否会有工具栏。
  • HTMLMediaElement.duration浮点数表示媒体文件的时间长度单位秒。如果当前没有媒体文件该属性返回0。该属性只读。
  • HTMLMediaElement.ended布尔值表示当前媒体文件是否已经播放结束。该属性只读。
  • HTMLMediaElement.error返回最近一次报错的错误对象如果没有报错返回null
  • HTMLMediaElement.loop布尔值表示媒体文件是否会循环播放对应 HTML 属性loop
  • HTMLMediaElement.muted布尔值表示音量是否关闭。
  • HTMLMediaElement.networkState当前网络状态共有四个可能的值。0表示没有数据1表示媒体元素处在激活状态但是还没开始下载2表示下载中3表示没有找到媒体文件。
  • HTMLMediaElement.paused布尔值表示媒体文件是否处在暂停状态。该属性只读。
  • HTMLMediaElement.playbackRate浮点数表示媒体文件的播放速度1.0是正常速度。如果是负数,表示向后播放。
  • HTMLMediaElement.played返回一个 TimeRanges 对象,表示播放的媒体内容。该属性只读。
  • HTMLMediaElement.preload字符串表示应该预加载哪些内容可能的值为nonemetadataauto
  • HTMLMediaElement.readyState整数表示媒体文件的准备状态可能的值为0没有任何数据、1已获取元数据、2可播放当前帧但不足以播放多个帧、3可以播放多帧至少为两帧、4可以流畅播放。该属性只读。
  • HTMLMediaElement.seekable返回一个 TimeRanges 对象,表示一个用户可以搜索的媒体内容范围。该属性只读。
  • HTMLMediaElement.seeking布尔值表示媒体文件是否正在寻找新位置。该属性只读。
  • HTMLMediaElement.src布尔值表示媒体文件的 URL对应 HTML 属性src
  • HTMLMediaElement.srcObject返回src属性对应的媒体文件资源,可能是MediaStreamMediaSourceBlobFile对象。直接指定这个属性,就可以播放媒体文件。
  • HTMLMediaElement.textTracks返回一个类似数组的对象包含所有文本轨道。该属性只读。
  • HTMLMediaElement.videoTracks返回一个类似数组的对象包含多有视频轨道。该属性只读。
  • HTMLMediaElement.volume浮点数表示音量。0.0 表示静音1.0 表示最大音量。

HTMLMediaElement接口有如下方法。

  • HTMLMediaElement.addTextTrack():添加文本轨道(比如字幕)到媒体文件。
  • HTMLMediaElement.captureStream():返回一个 MediaStream 对象,用来捕获当前媒体文件的流内容。
  • HTMLMediaElement.canPlayType():该方法接受一个 MIME 字符串作为参数,用来判断这种类型的媒体文件是否可以播放。该方法返回一个字符串,有三种可能的值,probably表示似乎可播放,maybe表示无法在不播放的情况下判断是否可播放,空字符串表示无法播放。
  • HTMLMediaElement.fastSeek():该方法接受一个浮点数作为参数,表示指定的时间(单位秒)。该方法将媒体文件移动到指定时间。
  • HTMLMediaElement.load():重新加载媒体文件。
  • HTMLMediaElement.pause():暂停播放。该方法没有返回值。
  • HTMLMediaElement.play():开始播放。该方法返回一个 Promise 对象。

下面是play()方法的一个例子。

var myVideo = document.getElementById('myVideoElement');

myVideo
.play()
.then(() => {
  console.log('playing');
})
.catch((error) => {
  console.log(error);
});

HTMLVideoElement 接口

HTMLVideoElement接口代表了<video>元素。这个接口继承了HTMLMediaElement接口,并且有一些自己的属性和方法。

HTMLVideoElement 接口的属性。

  • HTMLVideoElement.height字符串表示视频播放区域的高度单位像素对应 HTML 属性height
  • HTMLVideoElement.width字符串表示视频播放区域的宽度单位像素对应 HTML 属性width
  • HTMLVideoElement.videoHeight该属性只读返回一个整数表示视频文件自身的高度单位像素
  • HTMLVideoElement.videoWidth该属性只读返回一个整数表示视频文件自身的宽度单位像素
  • HTMLVideoElement.poster字符串表示一个图像文件的 URL用来在无法获取视频文件时替代显示对应 HTML 属性poster

HTMLVideoElement 接口的方法。

  • HTMLVideoElement.getVideoPlaybackQuality():返回一个对象,包含了当前视频回放的一些数据。

HTMLAudioElement 接口

HTMLAudioElement接口代表了<audio>元素。

该接口继承了HTMLMediaElement,但是没有定义自己的属性和方法。浏览器原生提供一个Audio()构造函数,返回的就是HTMLAudioElement实例。

var song = new Audio([URLString]);

Audio()构造函数接受一个字符串作为参数,表示媒体文件的 URL。如果省略这个参数可以稍后通过src属性指定。

生成HTMLAudioElement实例以后,不用插入 DOM可以直接用play()方法在背景播放。

var a = new Audio();
if (a.canPlayType('audio/wav')) {
  a.src = 'soundeffect.wav';
  a.play();
}

事件

<video><audio>元素有以下事件。

  • loadstart开始加载媒体文件时触发。
  • progress媒体文件加载过程中触发大概是每秒触发2到8次。
  • loadedmetadata媒体文件元数据加载成功时触发。
  • loadeddata当前播放位置加载成功后触发。
  • canplay已经加载了足够的数据可以开始播放时触发后面可能还会请求数据。
  • canplaythrough已经加载了足够的数据可以一直播放时触发后面不需要继续请求数据。
  • suspend已经缓冲了足够的数据暂时停止下载时触发。
  • stalled尝试加载数据但是没有数据返回时触发。
  • play调用play()方法时或自动播放启动时触发。如果已经加载了足够的数据,这个事件后面会紧跟playing事件,否则会触发waiting事件。
  • waiting由于没有足够的缓存数据无法播放或播放停止时触发。一旦缓冲数据足够开始播放后面就会紧跟playing事件。
  • playing媒体开始播放时触发。
  • timeupdatecurrentTime属性变化时触发每秒可能触发4到60次。
  • pause调用pause()方法、播放暂停时触发。
  • seeking脚本或者用户要求播放某个没有缓冲的位置播放停止开始加载数据时触发。此时seeking属性返回true
  • seekedseeking属性变回false时触发。
  • ended媒体文件播放完毕时触发。
  • durationchangeduration属性变化时触发。
  • volumechange音量变化时触发。
  • ratechange播放速度或默认的播放速度变化时触发。
  • abort停止加载媒体文件时触发通常是用户主动要求停止下载。
  • error网络或其他原因导致媒体文件无法加载时触发。
  • emptied由于errorabort事件导致networkState属性变成无法获取数据时触发。