video
-
src: 指定视频的播放地址
-
poster: 指定视频的封面 url
-
autoplay: 自动播放
-
loop:循环播放
-
controlslist
-
playsinline
-
controls
-
preload="metadata"
<video />
常见的视频格式区别
-
常见的视频格式有m3u8和mp4、flv
-
mp4适用于本地存储和离线播放,适合各种视频应用场景
-
m3u8是流媒体传输协议,适用于实时直播、点播和网络流媒体传输,特别适合在不同网络环境下进行视频流的适应性调整
-
flv文件可以实时边下载边播放,适用于网络直播、视频分享平台等场景
m3u8对比mp4的优势
m3u8比mp4快n倍
- m3u8支持分片加载
- mp4文件播放在开始加载的时候会读取很大的文件信息,出现的情况就是卡顿很长时间才能播放,而m3u8分片则会瞬间读取整个视频文件信息,马上开始加载第一片ts视频文件播放,不管是开始播放还是拖拽播放的加载速度都比mp4快N倍
- m3u8分段传输:M3U8 文件通常将视频内容分成多个小片段(通常为几秒钟的短片),这使得播放器可以快速开始播放第一段,而不需要等待整个视频下载完成
video尺寸比例问题
- 16:9 是一个非常常见的视频宽高比,它被广泛用于电视、电影和许多在线视频平台上
- 这里的9代表宽度,16代表高度
- 适合大多数现代视频内容,包括高清电视和宽屏电影。
- 4:3 这是传统的电视宽高比,也被称为标准屏幕宽高比(SDR)。它比16:9更宽,但高度更低。
- 适合需要较高垂直空间的内容,如某些教育视频或文档
- 1:1 这种宽高比通常被称为方形屏幕宽高比
- 它意味着视频的宽度和高度相等,这在某些社交媒体平台上很常见
设置video保持宽高比
- video保持一个特定的宽高比,通常是16:9
offsetWidth: 获取容器的宽度 (包含内边距padding和外边距margin)
- 增加一个配置aspectRatio,通过该属性配置,设置16:9、4:3等等比例
- aspectRatio表示宽高比
export enum AspectRatioEnum {
RATIO_16_9 = '16:9',
RATIO_4_3 = '4:3',
RATIO_1_1 = '1:1',
}
export const aspectRatioConfig = {
[AspectRatioEnum.RATIO_16_9]: 9 / 16,
[AspectRatioEnum.RATIO_4_3]: 3 / 4,
[AspectRatioEnum.RATIO_1_1]: 1 / 1,
};
const initPlayer = () => {
player.value = new Player(playerConfig.value);
// 播放器创建完成
player.value.once(Events.COMPLETE, () => {
if (containerRef.value) {
// 保持一个特定的宽高比
if (props.aspectRatio && Reflect.has(aspectRatioConfig, props.aspectRatio)) {
const width =
containerRef.value.offsetWidth * aspectRatioConfig[props.aspectRatio] + 'px';
containerRef.value.style.width = width;
}
}
});
}
ts文件理解
- ts文件是视频分片文件,ts文件是流式传输的,通过流媒体播放(HLS)
- 播放器请求
.m3u8文件,m3u8文件会列出所有.ts分段地址 - 播放器按顺序加载
.ts文件并播放
readyState理解
- readyState是视频的当前就绪状态
| 类型 | 描述 |
|---|---|
| Number | 表示视频元素的就绪状态 |
- 0 = HAVE_NOTHING - 没有视频是否准备好的信息
- 1 = HAVE_METADATA - 视频的元数据已准备就绪
- 2 = HAVE_CURRENT_DATA - 当前播放位置的数据可用,但没有足够的数据播放下一帧/毫秒
- 3 = HAVE_FUTURE_DATA - 当前和至少下一帧的数据可用
- 4 = HAVE_ENOUGH_DATA - 有足够的可用数据可供开始播放
video注意问题
- 在移动端h5中,浏览器会对播放器video进行劫持接管,导致自定义的video标签不生效,被浏览器内置的播放器给劫持接管了
- 解决办法:只能联系浏览器厂商加白名单
- 使用canvas 播放视频
- 使用canvas 遇到的坑:
video必须加x5-video-player-type="h5"属性,否则,在移动端就会卡死不能播放视频,个人认为是因为视频被接管的原因导致
- 使用canvas 遇到的坑:
- 视频的宽高比,通常是16:9
- 移动端,如果滑动保留上个视频的进度 但是swiper超过50个就卡
- 可以只渲染三个swiperitem, 只渲染一个video
- 浏览器对视频的解码是异步的,当视频完成解码解析后,就会触发seeked事件,在seeked事件中保证获取到正确的视频数据如画面帧
loadedmetadata事件 和 seeked事件
loadedmetadata和seeked是前端在视频抽帧、封面生成、进度跳转控制等场景中最关键的两个事件
loadedmetadata
-
视频的元信息(metadata)已加载完成
-
视频宽高(
videoWidth/videoHeight) -
时长(
duration) -
编码信息(
videoTracks/audioTracks)
-
-
此时浏览器还没有解码出具体的视频帧。
seeked 事件
- 浏览器已完成跳转到指定
currentTime,并成功解码并渲染出该时刻的帧 - 视频画面已经更新到你设置的时间点,画面数据可用,可以 draw 到 canvas
- 因此在seeked事件,可以保证获取视频的画面帧