bricks/aidocs/video.md
2025-10-05 06:39:58 +08:00

292 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bricks Video 模块技术文档
> 基于 `video.js` 实现的视频播放组件及 IPTV 集成控件
---
## 概述
本模块提供了两个核心类:
- **`bricks.Video`**:基于 [Video.js](https://videojs.com) 的视频播放组件,封装了常见播放控制逻辑和事件处理。
- **`bricks.Iptv`**IPTV 专用容器组件,集成频道信息展示与播放状态上报功能。
该模块适用于 Web 端流媒体(如 HLS、MP4播放场景支持自动播放、全屏、错误监听以及播放成功/失败回调上报。
---
## 依赖说明
- **[Video.js](https://videojs.com)**:必须在全局环境中加载 Video.js 库。
- `window.bricks`:基础框架对象,提供布局系统 (`Layout`, `VBox`)、HTTP 工具 (`HttpJson`, `HttpText`) 和事件调度机制。
- `schedule_once(fn, delay)`:延迟执行函数(单位:秒),用于异步初始化。
---
## 1. `bricks.Video` 类
继承自 `bricks.Layout`,封装 Video.js 播放器实例。
### 构造函数
```js
new bricks.Video(opts)
```
#### 参数 `opts`
| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| `url` | String | 是 | 视频资源 URL |
| `type` | String | 否 | MIME 类型(如 `'video/mp4'`),若未提供则自动推断 |
| `autoplay` | Boolean | 否 | 是否自动播放,默认 `false` |
| `fullscreen` | Boolean | 否 | 是否进入全屏模式,默认不启用 |
#### 示例
```js
const video = new bricks.Video({
url: 'https://example.com/stream.m3u8',
autoplay: true,
fullscreen: true
});
```
---
### 样式设置
构造时自动应用以下 CSS 类和样式:
```js
this.set_csses('video-js', 'vjs-big-play-centered', 'vjs-fluid');
this.set_style('object-fit', 'contain');
this.set_style('width', '100%');
this.set_style('height', '100%');
```
> ⚠️ 注意:需确保引入 Video.js 的 CSS 文件以正确渲染 UI。
---
### 事件系统
通过 `dispatch()` 触发以下自定义事件:
| 事件名 | 触发条件 | 回调参数格式 |
|------------|--------------------|------------------------------|
| `play_ok` | 视频开始播放 | `{ src: 当前视频URL }` |
| `play_end` | 视频播放结束 | `{ src: 当前视频URL }` |
| `play_failed` | 播放出错(网络/解码等) | `{ src: 当前视频URL }` |
可通过 `bind(event, handler)` 监听这些事件。
---
### 方法列表
#### `create()`
创建原生 `<video>` 元素并赋值给 `this.dom_element`,启用播放控件。
#### `create_player()`
初始化 Video.js 播放器实例,并绑定事件监听器。
##### 播放器配置项
```js
{
controls: true,
autoplay: opts.autoplay || false,
preload: "auto",
muted: true,
crossorigin: 'anonymous',
nativeTextTracks: false
}
```
> 🔊 **静音策略**初始静音1 秒后调用 `unmuted()` 解除静音并设音量为 100%。
#### `disable_captions()`
禁用所有字幕轨道text tracks防止默认字幕弹出。
#### `set_source(url, vtype)`
动态更换视频源。
- `url`: 新视频地址
- `vtype`: MIME 类型(可选)
内部会更新 `cur_url``cur_vtype`,并调用 `player.src()` 切换源。
#### `guess_type(url)`
根据文件扩展名推测 MIME 类型:
| 扩展名 | 类型 |
|-------|------|
| `.m3u8` | `application/x-mpegURL` |
| `.mp4` | `video/mp4` |
| `.avi` | `video/avi` |
| `.webm` | `video/webm` |
> 默认返回 `application/x-mpegURL`HLS 流)
#### `play()`
手动触发播放(调用 `player.play()`)。
#### `unmuted()`
解除静音并设置音量为最大值1.0)。延迟执行以绕过浏览器自动静音限制。
---
## 2. `bricks.Iptv` 类
继承自 `bricks.VBox`,用于构建完整的 IPTV 播放界面。
### 构造函数
```js
new bricks.Iptv(opts)
```
#### 支持的选项字段
| 字段名 | 类型 | 必填 | 描述 |
|--------|------|------|------|
| `iptv_data_url` | String | 是 | 获取频道数据的接口地址 |
| `playok_url` | String | 否 | 播放成功后上报的 URL |
| `playfailed_url` | String | 否 | 播放失败后上报的 URL |
> 💡 所有 URL 接口均使用 GET 请求传参。
---
### 内部结构
- 上方:`bricks.Text` 显示当前频道名称
- 下方:`bricks.Video` 实例进行播放
---
### 核心方法
#### `build_subwidgets()`
异步加载 IPTV 频道数据并初始化子组件:
1. 调用 `HttpJson().httpcall(iptv_data_url)` 获取频道信息
2. 缓存 `deviceid`(通过 `bricks.deviceid('iptv')`
3. 创建 `Video``Text` 组件并添加到布局中
4. 绑定播放事件回调
##### 返回数据示例user_data
```json
{
"id": "ch_001",
"tv_name": "CCTV-1 综合频道",
"url": "https://live.example.com/cctv1.m3u8"
}
```
#### `report_play_ok()`
当收到 `play_ok` 事件时调用,向 `playok_url` 发送设备和频道 ID 上报。
##### 请求参数
```json
{
"deviceid": "设备唯一标识",
"channelid": "当前频道ID"
}
```
#### `report_play_failed()`
播放失败时调用,向 `playfailed_url` 上报异常。
参数同上。
#### `setValue(data)`
外部更新频道内容的方法。
- 更新显示标题
- 更换播放地址
```js
iptv_widget.setValue({
id: 'ch_002',
tv_name: '湖南卫视',
url: 'https://live.example.com/hunantv.m3u8'
});
```
---
## 使用示例
### 注册组件(已内置)
```js
bricks.Factory.register('Video', bricks.Video);
bricks.Factory.register('Iptv', bricks.Iptv);
```
### 实例化 IPTV 播放器
```js
const iptv = new bricks.Iptv({
iptv_data_url: '/api/iptv/channel/current',
playok_url: '/api/report/playok',
playfailed_url: '/api/report/playfail'
});
// 添加到页面
document.body.appendChild(iptv.get_dom());
```
---
## 日志输出
模块在关键节点输出日志至控制台,便于调试:
- `build_subwidgets called`
- `this.user_data = ...`
- `report playok ok / failed`
- 错误提示等
---
## 注意事项
1. **跨域问题**:建议服务器配置 CORS 头部,或使用代理避免跨域限制。
2. **自动播放限制**:现代浏览器禁止无用户交互下的有声音频自动播放,因此采用“先静音播放 → 延迟取消静音”策略。
3. **HLS 支持**`.m3u8` 依赖浏览器对 MSE 的支持或 Video.js 的 hls.js 插件。
4. **延迟初始化**:使用 `schedule_once(..., 0.1)` 避免 DOM 渲染未完成导致的问题。
---
## 版本兼容性
- 浏览器Chrome / Firefox / Safari / Edge现代版本
- Video.js 版本≥7.x 或 ≥8.x推荐最新版
- 不支持 IE11 及以下
---
## 开发维护
- 作者Bricks Framework Team
- 官网参考:[https://videojs.com](https://videojs.com)
---
✅ **建议生产环境压缩代码并开启 Source Map 以便调试。**