天天看点

移动端html5视频开发指南

在页面添加一个视频

为video元素指定多个视频格式

并不是所有的浏览器都支持同一种格式,source可以让开发者为video元素指定多个视频格式

当浏览器解析到标签,使用type属性来决定哪个文件被下载和播放。如果浏览器支持webm格式,就会播放demo.webm文件,如果不支持,浏览器就会接着检查是否支持mpeg-4。这里https://www.xiph.org/video/vid1.shtml可以看到音视频在web上是如何工作的。

这种指定视频格式有下面的几点好处

开发这可以根据喜爱的顺序列出多个格式

浏览器客户端切换格式减少了延迟;只有一个请求去获取内容

在浏览器中选择视频格式比在浏览器端更加简单,快速,可靠

为每个source元素指定type属性可以提高网络性能,这样就不用让浏览器选择一个source,下载一段段视频,再判断格式是否支持。

在移动环境下上面你的几点好处尤其明显,移动环境下网速和延迟,使得用户的耐心是有限的。如果不为source属性指定type,当多个source都不支持时,会严重影响性能。同时也要保证请求的response heanders是否返回了正确的mime type,否则video source type也不工作。

为source指定一个开始和结束时间

这样可以节省带宽。使用media fragments api 可以为video元素添加一个开始时间和结束时间。

具体格式就是在url后面加入下面你的格式#t=start_time

假如要播放5秒到10秒的视频,向下面这样,[示例]()

使用media fragments api也可以为视频指定多个画面,https://www.youtube.com/watch?v=y3cfxqb7jzk可以看下这里的demo

注意

media fragments api支持大部分的android平台,但是ios不支持

range request需要服务器端支持

为视频指定一个封面

通过video元素的poster属性可以为视频指定封面,这样可以让用户在没有没有加载或者播放的情况下既可以对视频有所了解。

查看支持的格式

使用 canplaytype() 找出支持的视频格式。该方法采用与 mime-type 一致的字符串参数和可选编解码器,会返回以下某个值:

返回值

描述

(empty string)

容器和/或编解码器不受支持。

maybe

容器和编解码器可能受支持,但是浏览器 需要下载部分视频才能明确。

probably

格式似乎受支持。

以下是一些 canplaytype() 参数示例和在 chrome 中运行时的返回值:

类型 | 响应

video/xyz

(空字符串)

video/xyz; codecs="avc1.42e01e, mp4a.40.2"

video/xyz; codecs="nonsense, noise"

video/mp4; codecs="avc1.42e01e, mp4a.40.2"

video/webm

video/webm; codecs="vp8, vorbis"

制作多种格式的视频

许多工具都可以帮助您将同一视频保存为多种格式:

桌面工具: ffmpeg

gui应用: miro handbrake vlc

在线编码/转码服务:zencoder amazon elastic encoder

查看所用的格式

想了解浏览器实际所选的视频格式吗?

在 javascript 中,使用视频的 currentsrc 属性即可返回所用的来源。

查看视频大小

视频帧实际编码大小可能会与视频元素的尺寸有所不同(正如图片可能不会以实际尺寸显示一样)。

要查看视频的编码大小,请使用视频元素的 videowidth 和 videoheight 属性。width 和 height 会返回视频元素的尺寸,而这些尺寸可能已使用 css 或内联宽度和高度属性进行过调整。

请勿提供框架大小或质量超过平台处理范围的视频。

提供适当时长的视频。

视频较长可能会导致无法顺畅下载和定位:一些浏览器可能需要等待视频下载完成后才可播放。

确保视频不会溢出容器

如果视频元素过大,不适合当前视口,则可能会从容器中溢出,从而使用户无法观看内容或使用 控件。

您可以使用 javascript 或 css 控制视频尺寸

设备方向在不同设备中的工作原理

设备方向对台式机显示器或笔记本电脑而言不会构成问题,但对移动设备或平板电脑网页设计却是至关重要。

iphone 版 safari 可以在横向和纵向之间自由转换:

移动端html5视频开发指南
移动端html5视频开发指南

ipad 和 android 版 chrome 中的设备方向问题十分棘手。 例如,在未进行自定义设置的情况下,ipad 上横向播放的视频如下所示:

移动端html5视频开发指南

内联或全屏显示

不同的平台展示视频的方式也不相同。iphone 版 safari 会在网页中内联显示视频元素,却会以全屏模式播放视频:

移动端html5视频开发指南

在 android 设备中,用户可以通过点击全屏图标来请求全屏模式。但是默认情况下,浏览器以内联模式播放视频:

移动端html5视频开发指南

ipad 版 safari 以内联模式播放视频:

移动端html5视频开发指南

控制内容的全屏模式

不强制视频全屏播放的平台为 fullscreen api 提供广泛支持。使用此 api 可以控制内容或网页的全屏模式。

以全屏模式显示某元素,如video:

以全屏模式显示整个文档

您还可以监听全屏状态变化

或者,查看元素当前是否处于全屏模式:

您也可以使用 css :fullscreen 伪类来更改以全屏模式显示的元素的显示方式。

在支持 fullscreen api 的设备中,考虑将缩略图用作视频占位符:

requestfullscreen()有可能需要处理兼容性问题

添加字幕

要使媒体在移动设备上更易访问,请使用track元素添加字幕或说明。

android 版 chrome、ios safari 以及当前的所有桌面版浏览器(firefox 除外)均支持track元素

如下面这样

track元素的 src 属性决定字幕文件的位置。

定义字幕文件中的字幕

视频元素属性参考

属性

适用范围

src

所有浏览器

视频地址

poster

封面图,视频元素显示后无需下载视频内容就可立即显示的图片文件地址

preload

所有移动浏览器均无法预加载

浏览器提示:播放前预加载元数据(或某个视频)十分重要。选项包括无、元数据或自动

autoplay

iphone 和 android 设备均不支持;所有桌面版浏览器、ipad 以及 android 版 firefox 和 opera 均支持。

自动开始下载和播放

loop

循环播放视频

controls

显示默认视频控件(播放、暂停等)

自动播放

在桌面设备中,autoplay 会指示浏览器尽快开始下载并播放视频。在 ios 设备和 android 版 chrome 中,autoplay 不起作用;用户必须点按屏幕才能播放视频。

即使是在可以进行自动播放的平台中,您也需要考虑将其启用是否妥当:

数据流量可能会十分昂贵。

使媒体不事先询问就开始下载并播放,这可能会在无意间占用带宽和 cpu,从而使页面呈现出现延迟。

用户可能会处于不便播放音频或视频的环境中。

开发者可通过 websettings api 在 android webview 中配置自动播放行为。 默认情况下,它处于启用状态,但是 webviewit 应用可选择将其停用。

预加载

preload 属性会指示浏览器应预加载的信息或内容量

none

用户甚至可能不会观看视频,那就无需预加载任何内容。

metadata

应预加载元数据(时长、尺寸、文字轨道),但要尽量减少视频加载量。

auto

用户都希望可以立即下载整个视频。

preload 属性在不同平台中的效果不同。 例如,chrome 在桌面设备上可以缓冲 25 秒的视频,却无法在 ios 或 android 设备上缓冲。这意味着,移动设备上可能会出现播放启动延迟,而在桌面设备上却不会出现这种情况。请参阅 steve souders 的测试网页,了解全部详情。

视频元素的javascript属性

currenttime

获取或设置播放位置(以秒为单位)

volume

获取或设置视频的当前音量

muted

获取静音状态或将音频设为静音

playbackrate

获取或设置播放速率;1 表示以常规速度向前播放。

buffered

说明当前已缓冲、可以播放的视频量,示例,在chrome的缓冲量是21.44s

currentsrc

视频的当前播放位置。

videowidth

以像素为单位表示的视频帧宽度(这可能会与视频元素宽度有所不同)

videoheight

以像素为单位表示的视频帧高度(这可能会与视频元素高度有所不同)

移动设备既不支持 playbackrate,也不支持音量。

load()

在没有开始播放的情况下加载或重新加载视频来源:例如,当使用 javascript 更改视频 src 时

play()

从当前位置播放视频

pause()

在当前位置暂停播放视频

canplaytype('format')

找出支持的格式

除非以响应用户操作(例如点击按钮)的方式调用 play() 和 pause(), 否则这两种方法无法在移动设备(android 版 opera 除外)上起作用

视频元素的事件

事件名称

canplaythrough

当所提供的数据足以使浏览器相信自己可以连贯地播放整个视频时触发的事件。

ended

视频播放完毕后触发的事件

error

出现错误时触发的事件

playing

视频首次开始播放时、暂停后或重新开始播放时触发的事件。

progress

为指明下载进度而定期触发的事件

waiting

操作延迟,等待另一操作完成时触发的事件

loadedmetadata

浏览器完成视频元数据(时长、尺寸、文字轨道)加载后触发的事件

视频内容保护 html5 drm

持续更新中......

继续阅读