Video——网页视频的基本样式和基本功能实现

2021-09-01

视频样式

裸视频 无法进行任何操作

自带进度条、预加载

进度条:controls="controls" 准确来说应该是视频控制台,因为控制台包含进度条,单进度条会比较好理解一点

预加载:preload="preload" 感觉没什么用

禁用画中画:disablePictureInPicture="true" 默认为false

自带进度条、静音播放

进度条:controls="controls"

静音播放:muted="muted"

视频封面

设置视频封面:poster="https://github.com/logerlink/JSvideoDemo/blob/main/image/fengmian.jpg?raw=true"

自动播放 单循环播放 静音播放

自动播放:autoplay="autoplay"

循环播放:loop="loop"

静音播放:muted

更多属性及功能:HTML Video 标签 (w3school.com.cn)

值得注意的是controls、preload、muted、autoplay、loop的值是它本身,如设置视频静音播放我们可以设置为:muted="muted" 或者 muted 都是正确的,但是 muted="true" 或者 muted="false" 是错误的。通常设置true或者false默认都是muted,即都是静音.

基础功能

播放、暂停、播放暂停监听事件

当我们播放视频、停止视频时往往需要进行一些操作,这些操作建议都放在play、pause事件中处理。

快进快退

音量调整

音量的值在[0-1]区间

进入、退出全屏,全屏切换事件

html:

值得注意

1.html可以指定某个元素进入全屏。当我们请求浏览器全屏时,我们将该用videoWrapper元素来请求进入全屏,而不仅仅是video元素。

因为当浏览器进入全屏时,该元素会得到最高级,这时候就算其他元素设置z-index为最大值也无法展示在页面上(被全屏的元素遮住了)。所以如果我们只是用video元素请求进入全屏,那么除了视频其他自定义的内容(弹幕、自定义控制台)都不能一同携带到全屏中(无法正常显示)。

2.当我们进入全屏状态或者退出全屏状态时往往需要进行一些操作,这些操作建议都放在fullscreenchange 事件中处理。

3.当我们使用自定义进度条且进入全屏时,这时候默认的进度条就会出现了,我们需要用css将默认的进度条隐藏。当然这个问题的出现也是因为我们只用video元素来请求进入全屏的原因。

倍速播放

速度值在[0-16]区间 超过这个区间会报错

画中画

开启画中画

开启前需要判断视频是否支持画中画。否则调用requestPictureInPicture方法时会报错,在video标签中加上disablePictureInPicture="true"属性即可禁用画中画

关闭画中画

一个浏览器只能有一个画中画,所以直接用document对象关闭即可。关闭前也要判断该页面是否存在画中画,否则调用exitPictureInPicture方法时会报错

开启、关闭画中画的事件

当我们进入画中画模式或者退出画中画模式时往往需要进行一些操作,这些操作建议都放在enterpictureinpictureleavepictureinpicture事件中处理。

视频截图

通过drawImage将视频绘制到canvas上,再通过toDataURL获得图片的base64地址,再将这个地址赋给图片即可

视频播放事件

video事件

更多事件请参考:video 属性和事件用法大全 - rogerwu - 博客园 (cnblogs.com)

清晰度切换

换视频源:如要将视频A切换到视频B,视频A停止,记住A的播放时间(currentTime),通过src变更为视频B,将B的播放时间设置为A的播放时间

加广告

和清晰度切换逻辑差不多。唯一不同是要在广告视频结束后将原视频激活

<!-- 去广告,f12执行即可

-->

视频帧预览

步骤

1.自定义视频进度条 input type="range"

2.视频每隔5秒截取一张图片得到多张图片,使用ffmpeg工具

3.将多张图片合并为一张大图,如下图

image-20210831135751252

4.将这张大图设为预览图的背景图

5.进度条添加鼠标事件,通过鼠标位置(x坐标)获取当前鼠标位置的视频播放时间(currentTime),再通过这个时间截取背景图

image-20210831140655818

视频帧预览实现代码
c#每隔5秒截取一张图片

生成视频预览图、封面预览图、封面预览动图

image-20210831151953863

列表帧预览

与视频帧预览逻辑一致,不过如果想要简单一点可以直接用gif动图来代替

列表帧预览

弹幕功能

参考:html5 canvas+video实时弹幕&添加弹幕功能 - 简书 (jianshu.com)

requestAnimationFrame详解 - 简书 (jianshu.com)

image-20210901105228851

完整代码

logerlink/JSvideoDemo: JS video demo (github.com)

使用github文件资源请参考:github 文件资源访问 - 简书 (jianshu.com)