agora-mpk-web
v1.0.1
Published
agora-mpk-web
Downloads
3
Readme
安装
使用包管理器
npm install --save agora-mpk-web
或者
yarn add agora-mpk-web
浏览器直接引入
<head>
<script src="//unpkg.com/agora-mpk-web"></script>
<script src="//unpkg.com/agora-mpk-web/dist/style.css"></script>
</head>
Demo 示例
你可以参考我们提供的示例https://github.com/AgoraIO/agora-videojs-examples
里面包含了react18
,vue2
,vue3
等常见前端框架结合agora-mpk-web
的使用,也包含了浏览器直接引入使用browser
初始化
使用 npm 或者 yarn
当使用webpack
,rollup
,vite
等构建工具打包你的项目时,你可以通过如下方式初始化播放器
<video id="my-player" class="video-js"></video>
import videojs from "agora-mpk-web";
import "agora-mpk-web/dist/style.css";
const options = {
controls: true,
sources: [
{
src: "https://localhost:8080/demo.m3u8",
type: "video/hls"
}
],
plugins: {
DataReport: {
token: "123",
vid: 123
}
}
};
const player = videojs("my-player", options);
通过浏览器直接引入使用
当通过浏览器直接引入时,你可以选择自动初始化播放器或者手动初始化播放器
- 自动初始化:
你需要在video
标签上面设置data-setup='{}'
属性,注意:data-setup 中的数据必须是 JSON 字符串,当页面加载时,会自动初始化播放器
<video
class="video-js"
controls
data-setup='{
"plugins":{
"DataReport":{
"token":"123",
"vid":123
}
}
}'>
<source src="https://localhost:8080/demo.m3u8" type="video/hls"></source>
</video>
- 手动初始化:
<video id="my-player" class="video-js"></video>
const options = {
controls: true,
sources: [
{
src: "https://localhost:8080/demo.m3u8",
type: "video/hls"
}
],
plugins: {
DataReport: {
token: "123",
vid: 123
}
}
};
const player = videojs("my-player", options);
自动初始化中的data-setup
配置和手动初始化中的options
配置是等价的
options 参数
详情见https://videojs.com/guides/options/
播放格式
目前播放器支持hls
,flv
,mp4
播放类型所对应的type
类型如下:
| 类型 | type | | ---- | --------- | | hls | video/hls | | flv | video/flv | | mp4 | video/mp4 |
上报数据
import videojs from "agora-mpk-web";
import "agora-mpk-web/dist/style.css";
const options = {
// ...
plugins: {
DataReport: {
token: "123",
vid: 123,
debug: true
}
}
};
const player = videojs("my-player", options);
DataReport 配置选项
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 | 可选值 | | ------ | ------- | -------- | ------ | ------------------- | ------ | | token | string | 是 | - | token | - | | vid | number | 是 | - | vid | - | | debug | boolean | 否 | false | 是否开启 debug 模式 | - |
播放 hls
基本使用
type
指定为video/hls
即可
import videojs from "agora-mpk-web";
import "agora-mpk-web/dist/style.css";
const options = {
// ...
sources: [
{
src: "https://localhost:8080/playlist.m3u8",
type: "video/hls"
}
]
};
const player = videojs("my-player", options);
自定义配置
你也可以通过自定义配置来配置hls
的行为
注意:苹果手机,hls.config 配置无效
import videojs from "agora-mpk-web";
import "agora-mpk-web/dist/style.css";
const options = {
// ...
sources: [
{
src: "https://localhost:8080/playlist.m3u8",
type: "video/hls"
}
],
html5: {
hls: {
// 添加hls.js自定义配置
config: {
// ...
},
debug: true
}
}
};
const player = videojs("my-player", options);
hls 配置选项
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 | 可选值 | | ------ | ------- | -------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | | config | Object | 否 | - | 详情见https://github.com/video-dev/hls.js/blob/HEAD/docs/API.md#fine-tuning | - | | debug | boolean | 否 | false | 是否开启 debug 模式 | - |
事件监听
你可以通过如下方式监听hls
相关的事件,注意:苹果手机,所有事件是不生效的
const player = videojs("my-player", options);
player.on(videojs.HlsEvents.MEDIA_ATTACHING, ({ data }) => {
console.log(data);
});
在typescript
中,你可能会遇见类型“typeof videojs”上不存在属性“HlsEvents”
的错误,请使用如下方式:
const player = videojs("my-player", options);
const HlsEvents = (videojs as any).HlsEvents
player.on(HlsEvents.MEDIA_ATTACHING, ({ data }) => {
console.log(data);
});
相关事件可参考:https://github.com/video-dev/hls.js/blob/HEAD/docs/API.md#runtime-events
播放 flv
基本使用
type
指定为video/flv
即可
import videojs from "agora-mpk-web";
import "agora-mpk-web/dist/style.css";
const options = {
// ...
sources: [
{
src: "https://localhost:8080/playlist.flv",
type: "video/flv"
}
]
};
const player = videojs("my-player", options);
自定义配置
你也可以通过自定义配置来配置flv
的行为
import videojs from "agora-mpk-web";
import "agora-mpk-web/dist/style.css";
const options = {
// ...
sources: [
{
src: "https://localhost:8080/playlist.flv",
type: "video/flv"
}
],
html5: {
// 添加flv.js自定义配置
flv: {
mediaDataSource: {
// ...
},
config: {
// ...
},
debug: true
}
}
};
const player = videojs("my-player", options);
flv 配置选项
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 | 可选值 | | --------------- | ------- | -------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------ | | mediaDataSource | Object | 否 | - | 详情见https://github.com/bilibili/flv.js/blob/master/docs/api.md#flvjscreateplayer | - | | config | Object | 否 | - | 详情见https://github.com/bilibili/flv.js/blob/master/docs/api.md#flvjscreateplayer | - | | debug | boolean | 否 | false | debug | - | | lowDelay | boolean | 否 | false | 是否开启低延迟加速追帧。当视频超过 3 秒延迟时,播放器会自动调整倍速播放,追赶到 3 秒内时,恢复正常播放 | - |
事件监听
你可以通过如下方式监听flv
相关的事件
const player = videojs("my-player", options);
player.on(videojs.FlvEvents.FLVERROR, ({ data }) => {
console.log(data);
});
在typescript
中,你可能会遇见类型“typeof videojs”上不存在属性“FLVERROR”
的错误,请使用如下方式:
const player = videojs("my-player", options);
const FlvEvents = (videojs as any).FlvEvents
player.on(FlvEvents.FLVERROR, ({ data }) => {
console.log(data);
});
flv 事件
| 事件名称 | 说明 | 回调参数 | | -------------------- | ---------------------------------------------------------------- | -------- | | flvError | 播放过程中因任何原因发生错误 | data:any | | flvLoadingComplete | 输入的 MediaDataSource 已经完全缓冲到 end | data:any | | flvRecoveredEarlyEof | 缓冲期间发生意外的网络 EOF,但已自动恢复 | data:any | | flvMediaInfo | 提供媒体的技术信息,如视频/音频编解码器、比特率等 | data:any | | flvMetadataArrived | 使用“onMetaData”标记提供 FLV 文件(流)可以包含的元数据 | data:any | | flvScriptdataArrived | 提供 FLV 文件(流)可以包含的脚本数据(OnCuePoint / OnTextData) | data:any | | flvStatisticsInfo | 提供播放统计信息,如丢帧、当前速度等 | data:any |
相关事件可参考https://github.com/bilibili/flv.js/blob/master/docs/api.md#flvjsevents
常见问题
自动播放
一般来说,浏览器是不允许自动播放,这是因为浏览器的自动播放策略所导致的。可以参考https://sites.google.com/a/chromium.org/dev/audio-video/autoplay
但是以下三种情况可实现自动播放:
用户与网页进行交互:浏览器是不允许在用户没有操作的的时候自动播放视频的。这种方式前提是要把
autoplay
设置为true
静音播放:浏览器是不允许有声音的视频进行自动播放的,但是允许静音的视频进行播放的。可通过设置
autoplay
为muted
实现网站媒体参与度:媒体参与度是指用户在某个网站下观看视频的时长,只要观看时间长,媒体参与度就会高,不同的浏览器实现的机制不一样。以谷歌浏览器为例,我们可以通过打开
chrome://media-engagement/
查看每个网站的媒体参与度,只要媒体参与度足够高,就可以实现自动播放
播放器样式丢失
请检查是否引入了样式文件
video
标签中必须包含class="video-js"
的样式类
x5 内核常见属性
<video
playsinline="true"
x5-playsinline="true"
webkit-playsinline="true"
x-webkit-airplay="allow"
airplay="allow"
x5-video-player-type="h5"
x5-video-player-fullscreen="false"
x5-video-orientation="portrait"
></video>
x-webkit-airplay
,airplay
:设置允许设备播放x5-video-player-type
:控制网页内部同层播放,可以再视频上方显示 html 元素x5-playsinline
:设置 android 在微信中内联播放视频x5-video-orientation
:控制横竖屏。landscape
- 横屏、portrait
- 竖屏、landscape|portrait
- 跟随手机自动旋转。此属性只在声明了x5-video-player-type='h5'
情况下生效x5-video-player-fullscreen
:进入全屏通知,x5videoenterfullscreen
- 进入全屏,x5videoexitfullscreen
- 退出全屏webkit-playsinline
,playsinline
:设置 ios 在微信中内联播放视频
基于以上的一些最佳实践,播放器内部在检测到是移动端的时候,就会自动添加相关属性。如需要设置其他属性,请在video
标签中自行设置
浏览器劫持 video 标签
这个问题常见于移动端,表现形式为使用浏览器自带的播放器替换 video 标签,此时无法通过 js、css 修改相关的东西,播放器的样式并不是期望的样式,甚至还可能会出现一些额外 UI,广告等内容。部分事件也无法被监听到。
相关被浏览器劫持的问题暂无通用的解决方案,需要浏览器厂商提供方法
x5 内核常见问题
https://docs.qq.com/doc/DTUxGdWZic0RLR29B
ios 系统播放全屏
可在video
标签上面设置webkit-playsinline="true"
和playsinline="true"
。
播放器已经在内部进行了设置,如果需要修改属性值,请在video
标签上面进行设置
https 和 http
如果你的网站地址是https
,但是你的拉流地址(播流地址)是http
,你将会在控制在中看见如下错误:
Mixed Content: The page at 'https://xxxxx' was loaded over HTTPS, but requested an insecure resource 'http://xxxx/aa.flv'. This request has been blocked; the content must be served over HTTPS.
意思是https
中是不允许访问http
,这是浏览器所禁止的,你需要把http
升级为https
跨域访问
如果你的网站地址跟拉流地址(播流地址)不是同源的情况下,你可能会在控制台中看见如下错误:
Access to fetch at 'http://xxx/xx.flv' from origin 'http://xxx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
这是浏览器端的同源策略导致的跨域问题。你需要对拉流地址(播流地址)端开启跨域访问
flv 拉流地址重定向
在移动端环境下播放 flv 点播时,如果拉流地址存在重定向,你可能会遇见,第一次请求会请求成功,此时会加载一部分数据。等差不多播放完这部分数据时,此时会发起第二次请求,加载剩下的数据,此时请求会一直处于pending
状态,最终导致加载出错。你可以通过设置reuseRedirectedURL: true
来解决这个问题。播放器已经默认进行设置了,如需要设置其他值,请自行设置
flv 直播模式
当你使用 flv 直播时,请设置isLive
为true
const options = {
// ...
html5: {
flv: {
mediaDataSource: {
isLive: true
}
}
}
};
flv 播放纯音频
当你使用 flv 播放纯音频的时候,请设置hasVideo
为false
const options = {
// ...
html5: {
flv: {
mediaDataSource: {
hasVideo: false
}
}
}
};
react 结合播放器
在react
中,如果你是用了React.StrictMode
组件进行包裹,会导致所有的组件默认进行两次渲染,这是react
官方刻意为之的,可参考https://github.com/facebook/react/issues/17786。
组件默认渲染两次会导致播放器初始出错,你可以删除React.StrictMode
组件。但是如果你确实需要React.StrictMode
组件,你可以采用定时器的方法延迟初始化,让播放器只初始化一次。
可参考我们提供的demo,demo 就是基于定时器的方法实现的
vue2 结合播放器
如果你是使用@vue/cli
脚手架生成的一个vue2
项目,在开发环境下,可能会出现ReferenceError: _typeof is not defined
的问题。
这是因为hls.js
日志模式下,会有typeof debugConfig === 'object'
判断。但是vue-cli
打包工具在开发环境下,进行语法转换的时候,会把typeof
转化为_typeof
,但是_typeof
并没有定义,所以导致出现问题
这是babel
官方一个已知 bug(已经修复),但是@vue/cli
脚手架还有问题,这个问题只会在开发环境下出现,生产环境下是不会出现的
所以我们可以通过在开发环境下设置debug:true
来规避这个问题,生产环境设置为debug:false
可参考我们提供的demo