hls.js初始化、钩子函数及执行关系超完全解析(附代码)
前言
基于官方 hls.js 1.4.14的API 文档,全面修正、梳理 hls.js 正确的初始化流程、官方钩子函数(含精准参数)及事件执行逻辑,确保所有内容与官方定义完全一致。
一、hls.js 初始化(官方标准流程)
初始化核心是「创建实例→绑定媒体元素→加载资源」,流程与官方 API 完全对齐,无额外冗余步骤。
1. 前置条件
- 引入 hls.js 脚本(CDN 或本地文件):
html
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script> <video id="videoPlayer" controls width="800"></video>
- 确保 DOM 加载完成(避免
video元素未渲染)。
2. 官方标准初始化代码
javascript
if (Hls.isSupported()) {
// 1. 配置参数(官方常用配置,按需调整)
const hlsConfig = {
startLevel: -1, // 自动选择清晰度
maxBufferLength: 30, // 视频最大缓冲时长(秒)
enableWorker: true, // 启用 Web Worker 解析
backBufferLength: 90 // 后台缓冲保留时长(秒)
};
// 2. 创建 hls 实例
const hls = new Hls(hlsConfig);
const video = document.getElementById('videoPlayer');
// 3. 绑定媒体元素(触发 MEDIA_ATTACHING → MEDIA_ATTACHED)
hls.attachMedia(video);
// 4. 监听媒体绑定成功事件,加载资源
hls.on(Hls.Events.MEDIA_ATTACHED, () => {
console.log('媒体元素绑定成功,加载 HLS 流');
hls.loadSource('https://example.com/stream/main.m3u8'); // 加载主 m3u8
});
// 5. 可选:监听初始化相关事件
hls.on(Hls.Events.MANIFEST_PARSED, (event, data) => {
console.log('主 m3u8 解析完成,可用清晰度:', data.levels.length);
video.play().catch(err => console.log('自动播放失败:', err));
});
// 6. 错误处理(按官方错误参数结构)
hls.on(Hls.Events.ERROR, (event, data) => {
if (data.fatal) {
switch (data.type) {
case Hls.ErrorTypes.NETWORK_ERROR:
console.log('网络错误:', data.details, data.url);
hls.startLoad(); // 重试加载
break;
case Hls.ErrorTypes.MEDIA_ERROR:
console.log('媒体错误:', data.details);
hls.recoverMediaError(); // 恢复媒体错误
break;
default:
hls.destroy();
break;
}
}
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// 降级:浏览器原生支持 HLS(如 Safari)
video.src = 'https://example.com/stream/main.m3u8';
video.play();
}
3. 官方核心实例属性(可直接访问)
hls.media:绑定的<video>元素hls.levels:解析后的清晰度列表(数组,每个元素为 Level 对象,含bitrate/width/height等)hls.currentLevel:当前激活的清晰度 ID(-1 = 自动)hls.audioTracks:可用音频轨道列表hls.subtitleTracks:可用字幕轨道列表hls.state:实例状态(IDLE/LOADING/READY/ERROR)
二、官方钩子函数(事件)权威分类详解
所有事件均基于你提供的官方文档,按「功能场景」分类,包含「触发时机」「官方参数结构」「参数意义」三部分,无任何自定义或错误参数。
1. 生命周期事件(实例 / 媒体绑定状态)
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 |
|---|---|---|---|
MEDIA_ATTACHING | 调用 attachMedia() 后,MediaSource 绑定前 | { media: HTMLVideoElement } | media:待绑定的视频元素 |
MEDIA_ATTACHED | MediaSource 成功绑定到视频元素后 | { media: HTMLVideoElement } | media:已绑定的视频元素 |
MEDIA_DETACHING | 调用 detachMedia() 前,MediaSource 解绑前 | { } | 无额外参数 |
MEDIA_DETACHED | MediaSource 从视频元素解绑后 | { } | 无额外参数 |
DESTROYING | 调用 destroy() 后,实例开始销毁时 | { } | 区别于 MEDIA_DETACHED,支持解绑后重新绑定 |
2. 资源加载事件(m3u8 / 清晰度 / 音频轨道)
(1)Manifest(主 m3u8)相关
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 |
|---|---|---|---|
MANIFEST_LOADING | 开始请求主 m3u8 文件时 | { url: string } | url:主 m3u8 的请求地址 |
MANIFEST_LOADED | 主 m3u8 加载完成(未解析) | { levels: Level[], audioTracks: AudioTrack[], captions?: any[], subtitles?: SubtitleTrack[], url: string, stats: LoadStats, sessionData: any[], networkDetails: any } | - levels:可用清晰度列表;- stats:加载统计(耗时、状态码等);- networkDetails:调试用网络详情(XHR/fetch 响应) |
MANIFEST_PARSED | 主 m3u8 解析完成后 | { levels: Level[], firstLevel: number, audioTracks: AudioTrack[], subtitleTracks: SubtitleTrack[], stats: LoadStats, audio: boolean, video: boolean, altAudio: boolean } | - firstLevel:第一个清晰度索引;- audio/video:是否含音视频流;- altAudio:是否含备选音频轨道 |
(2)Level(清晰度)相关
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 | |
|---|---|---|---|---|
LEVEL_LOADING | 开始请求某个清晰度的子 m3u8 时(非主 m3u8 直接加载的情况) | `{ url: string, level: number, deliveryDirectives: any | null }` | - level:清晰度 ID;- deliveryDirectives:LL-HLS 交付指令(不支持时为 null) |
LEVEL_LOADED | 清晰度子 m3u8 加载完成后 | { details: LevelDetails, level: number, stats: LoadStats } | - details:清晰度详情(片段列表、编码等);- stats:加载统计信息 | |
LEVEL_UPDATED | 清晰度详情基于历史数据更新后 | { details: LevelDetails, level: number } | details:更新后的清晰度详情 | |
LEVEL_SWITCHING | 发起清晰度切换请求时 | { level: number, ...Level对象属性 } | - level:目标清晰度 ID;- 含 Level 对象所有属性(如 bitrate/width 等) | |
LEVEL_SWITCHED | 清晰度切换生效时 | { level: number } | level:最终激活的清晰度 ID | |
LEVELS_UPDATED | 调用 removeLevel() 移除清晰度后 | { levels: Level[] } | levels:更新后的可用清晰度列表 |
(3)音频 / 字幕轨道相关
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 | |
|---|---|---|---|---|
AUDIO_TRACKS_UPDATED | 音频轨道列表更新时 | { audioTracks: AudioTrack[] } | audioTracks:更新后的音频轨道列表 | |
AUDIO_TRACK_LOADING | 开始请求某个音频轨道时 | { url: string, id: number } | - url:音频轨道 m3u8 地址;- id:音频轨道 ID | |
AUDIO_TRACK_LOADED | 音频轨道加载完成后 | { details: LevelDetails, id: number, stats: LoadStats } | details:音频轨道详情 | |
AUDIO_TRACK_SWITCHING | 发起音频轨道切换请求时 | `{ id: number, type: 'AUDIO' | 'main', url: string }` | type:轨道类型(专属音频 / 主音频) |
AUDIO_TRACK_SWITCHED | 音频轨道切换生效时 | { id: number } | id:激活的音频轨道 ID | |
SUBTITLE_TRACKS_UPDATED | 字幕轨道列表更新时 | { subtitleTracks: SubtitleTrack[] } | subtitleTracks:更新后的字幕轨道列表 | |
SUBTITLE_TRACK_LOADING | 开始请求某个字幕轨道时 | { url: string, id: number } | - url:字幕轨道地址;- id:字幕轨道 ID | |
SUBTITLE_FRAG_PROCESSED | 字幕片段处理完成后 | { success: boolean, frag: Fragment, error?: any } | - success:处理是否成功;- frag:字幕片段对象 |
3. 片段(Fragment)处理事件(核心)
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 | |
|---|---|---|---|---|
FRAG_LOADING | 开始请求某个 ts 片段时 | `{ frag: Fragment, targetBufferTime: number | null }` | - frag:片段对象(含 url/start/duration 等);- targetBufferTime:该片段要填充的未缓冲时间点(null 为无特定目标) |
FRAG_LOAD_EMERGENCY_ABORTED | 紧急降清晰度时,中断片段加载 | { frag: Fragment } | frag:被中断加载的片段对象 | |
FRAG_LOADED | 片段加载完成(获取二进制数据) | { frag: Fragment, payload: ArrayBuffer, stats: LoadStats } | - payload:片段原始二进制数据;- stats:加载统计(耗时、字节数等) | |
FRAG_DECRYPTED | 加密片段解密完成后 | { id: number, frag: Fragment, payload: ArrayBuffer, stats: { tstart: number, tdecrypt: number } } | - id:解复用器 ID;- tstart:解密开始时间;- tdecrypt:解密耗时 | |
FRAG_PARSING_INIT_SEGMENT | 从片段中提取初始化片段后 | { id: number, frag: Fragment, moov: any, codecs: string } | - moov:MP4 的 moov 盒子;- codecs:片段编码格式 | |
FRAG_PARSED | 片段解析完成后 | { frag: Fragment, partIndex: number } | partIndex:片段的分片索引(无分片时为 0) | |
FRAG_BUFFERED | 片段重新封装后,写入 SourceBuffer 完成 | { id: number, frag: Fragment, stats: LoadStats } | id:解复用器 ID;stats:写入统计信息 | |
FRAG_CHANGED | 当前播放位置匹配的片段变更时 | { id: number, frag: Fragment } | frag:新匹配的片段对象 |
4. 缓冲管理事件
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 |
|---|---|---|---|
BUFFER_RESET | 缓冲即将重置时(如清晰度切换) | { } | 无额外参数 |
BUFFER_CODECS | 确定缓冲所需的音视频编码后 | { audio?: Track[], video?: Track[] } | Track:含 id/codec/container 等属性 |
BUFFER_CREATED | SourceBuffer 创建完成后 | { tracks: { audio?: Track[], video?: Track[], audiovideo?: Track[] } } | audiovideo:音视频合并轨道(如需) |
BUFFER_APPENDING | 开始向缓冲写入片段时 | { parent: any, type: string, frag: Fragment, part: any, chunkMeta: any, data: ArrayBuffer } | - type:轨道类型(video/audio);- data:待写入的片段数据 |
BUFFER_APPENDED | 片段写入缓冲完成后 | { parent: any, type: string, frag: Fragment, part: any, chunkMeta: any, timeRanges: { video?: TimeRange, audio?: TimeRange, audiovideo?: TimeRange } } | timeRanges:写入后的缓冲时间范围 |
BUFFER_FLUSHING | 即将清空缓冲时 | { startOffset: number, endOffset: number, type: SourceBufferName } | - startOffset/endOffset:清空的时间范围;- type:缓冲类型 |
BUFFER_FLUSHED | 缓冲清空完成后 | { type: SourceBufferName } | type:已清空的缓冲类型 |
BUFFER_EOS | 流结束,通知缓冲不再接收数据 | { type: SourceBufferName } | type:结束的缓冲类型 |
BACK_BUFFER_REACHED | 达到 backBufferLength 配置的后台缓冲时长 | { bufferEnd: number } | bufferEnd:当前缓冲的结束时间 |
5. 其他关键事件
| 事件名 | 触发时机 | 官方参数结构 | 参数意义 |
|---|---|---|---|
KEY_LOADING | 开始请求解密密钥时 | { frag: Fragment } | frag:需要解密的片段对象 |
KEY_LOADED | 解密密钥加载完成后 | { frag: Fragment } | frag:对应需要解密的片段对象 |
FPS_DROP | 监控周期内帧率下降超过阈值 | { curentDropped: number, currentDecoded: number, totalDroppedFrames: number } | - curentDropped:当前周期丢帧数;- totalDroppedFrames:总丢帧数 |
ERROR | 发生错误时 | { type: string, details: string, fatal: boolean, ...其他错误相关数据 } | - type:错误类型(networkError/mediaError 等);- details:错误详情;- fatal:是否为致命错误 |
三、官方钩子函数执行关系(事件链)
所有事件严格遵循官方定义的触发顺序,以下为核心流程的事件链:
1. 初始化 + 主 m3u8 加载流程
plaintext
MEDIA_ATTACHING → MEDIA_ATTACHED → MANIFEST_LOADING → MANIFEST_LOADED → MANIFEST_PARSED → LEVEL_LOADING(首个清晰度) → LEVEL_LOADED → LEVEL_UPDATED → FRAG_LOADING(首个片段) → FRAG_LOADED → FRAG_DECRYPTED(加密片段) → FRAG_PARSING_INIT_SEGMENT → FRAG_PARSED → BUFFER_APPENDING → BUFFER_APPENDED → FRAG_BUFFERED → (播放开始)
2. 清晰度切换流程
plaintext
LEVEL_SWITCHING → BUFFER_RESET → LEVEL_LOADING(新清晰度) → LEVEL_LOADED → LEVEL_UPDATED → FRAG_LOADING(新清晰度首个片段) → FRAG_LOADED → ...(片段处理流程) → LEVEL_SWITCHED → FRAG_BUFFERED → (继续播放)
3. 片段加载循环流程(播放中)
plaintext
FRAG_CHANGED → FRAG_LOADING → FRAG_LOADED → (加密片段触发 KEY_LOADING → KEY_LOADED → FRAG_DECRYPTED) → FRAG_PARSED → BUFFER_APPENDING → BUFFER_APPENDED → FRAG_BUFFERED → (循环直到播放结束或切换清晰度)
4. 错误处理流程
plaintext
ERROR(fatal: true) → (根据错误类型分支) - 网络错误:MANIFEST_LOADING/FRAG_LOADING(重试) - 媒体错误:BUFFER_RESET → FRAG_LOADING(重新加载片段) - 帧率下降:FPS_DROP → FPS_DROP_LEVEL_CAPPING → LEVEL_SWITCHING(降清晰度) → 错误恢复 → 回到对应流程继续播放
5. 销毁流程
plaintext
destroy() → DESTROYING → MEDIA_DETACHING → MEDIA_DETACHED
四、官方 API 核心使用示例(修正后)
基于官方参数结构,提供高频场景的正确用法:
1. 监听片段加载(含 URL 验证)
javascript
hls.on(Hls.Events.FRAG_LOADING, (event, data) => {
console.log('片段开始加载:');
console.log('完整请求 URL:', data.frag.url); // 如 https://.../lhg_segment_000.ts
console.log('片段原始路径(m3u8中定义):', data.frag.rawUrl); // 如 lhg_segment_000.ts
console.log('目标缓冲时间:', data.targetBufferTime);
console.log('所属清晰度 ID:', data.frag.level); // 通过片段对象获取清晰度 ID
});
hls.on(Hls.Events.FRAG_LOADED, (event, data) => {
console.log('片段加载完成,大小:', data.payload.byteLength + ' 字节');
console.log('加载耗时:', data.stats.loadTime + ' 毫秒');
});
2. 监听清晰度切换
javascript
hls.on(Hls.Events.LEVEL_SWITCHING, (event, data) => {
console.log('切换清晰度:目标 ID =', data.level);
console.log('目标清晰度码率:', data.bitrate / 1000 + 'kbps');
});
hls.on(Hls.Events.LEVEL_SWITCHED, (event, data) => {
console.log('清晰度切换完成,当前 ID =', data.level);
const currentLevel = hls.levels[data.level];
console.log('当前清晰度分辨率:', currentLevel.width + 'x' + currentLevel.height);
});
3. 加密片段密钥加载监听
javascript
hls.on(Hls.Events.KEY_LOADING, (event, data) => {
console.log('开始加载密钥,对应片段:', data.frag.url);
});
hls.on(Hls.Events.KEY_LOADED, (event, data) => {
console.log('密钥加载完成,片段即将解密:', data.frag.url);
});
五、核心总结(官方 API 关键点)
- 参数准确性:所有事件参数以官方文档为准,如
FRAG_LOADING无levelIndex,需通过data.frag.level获取清晰度 ID;LEVEL_SWITCHING无旧清晰度索引,仅含目标level。 - URL 逻辑:
frag.url是 hls.js 拼接后的完整绝对 URL(如https://.../lhg_segment_000.ts),frag.rawUrl是 m3u8 中定义的原始路径(如lhg_segment_000.ts),密钥 URL 处理逻辑一致。 - 废弃事件:
FRAG_LOAD_PROGRESS「已废弃」,避免使用。 - 依赖关系:后续事件依赖前置事件完成(如
FRAG_PARSED必须在FRAG_LOADED之后),不可跨步骤监听。 - 错误处理:
fatal: true的错误必须处理,否则播放中断,可通过data.type/data.details定位问题。
六、附录(官方API钩子说明部分)
完整事件列表如下:
- `Hls.Events.MEDIA_ATTACHING` - 在 MediaSource 附加到媒体元素之前触发
- 数据:{ media: 媒体元素 }
- `Hls.Events.MEDIA_ATTACHED` - 当 MediaSource 成功附加到媒体元素时触发
- 数据:{ media: 媒体元素 }
- `Hls.Events.MEDIA_DETACHING` - 在 MediaSource 从媒体元素分离之前触发
- 数据:{ }
- `Hls.Events.MEDIA_DETACHED` - 当 MediaSource 从媒体元素分离后触发
- 数据:{ }
- `Hls.Events.BUFFER_RESET` - 当缓冲区即将重置时触发
- 数据:{ }
- `Hls.Events.BUFFER_CODECS` - 当确定需要为其创建缓冲区以推入数据的编解码器时触发
- 数据:{ audio? : `[轨道对象数组]`, video? : `[轨道对象数组]` }
- `Hls.Events.BUFFER_CREATED` - 当源缓冲区(SourceBuffer)创建完成时触发
- 数据:{ tracks : { audio? : `[轨道对象数组]`, video? : `[轨道对象数组]`, audiovideo?: `[轨道对象数组]` } }
接口 Track { id: 'audio' | 'main'(轨道类型标识), buffer?: SourceBuffer(关联的源缓冲区), container: string(容器格式), codec?: string(编解码器类型), initSegment?: Uint8Array(初始化片段数据), levelCodec?: string(层级编解码器信息), metadata?: any(元数据) }
- `Hls.Events.BUFFER_APPENDING` - 当向缓冲区追加片段时触发
- 数据:{ parent(父对象), type(类型), frag(片段对象), part(分片对象), chunkMeta(分片元数据), data(数据内容) }
- `Hls.Events.BUFFER_APPENDED` - 当媒体片段成功追加到缓冲区后触发
- 数据:{ parent : 触发 `BUFFER_APPENDING` 的播放列表类型, type(类型), frag(片段对象), part(分片对象), chunkMeta(分片元数据), timeRanges : { video?: 视频时间范围, audio?: 音频时间范围, audiovideo?: 音视频合并时间范围 } }
- `Hls.Events.BUFFER_EOS` - 当流结束且需通知媒体缓冲区不再有新数据时触发
- 数据:{ type: 源缓冲区名称(SourceBufferName) }
- `Hls.Events.BUFFER_FLUSHING` - 当媒体缓冲区需要刷新时触发
- 数据:{ startOffset(起始偏移量), endOffset(结束偏移量), type: 源缓冲区名称(SourceBufferName) }
- `Hls.Events.BUFFER_FLUSHED` - 当媒体缓冲区刷新完成后触发
- 数据:{ type: 源缓冲区名称(SourceBufferName) }
- `Hls.Events.BACK_BUFFER_REACHED` - 当达到 [backBufferLength](#backbufferlength) 配置项定义的后缓冲区阈值时触发
- 数据:{ bufferEnd: number(缓冲区结束位置时间戳) }
- `Hls.Events.MANIFEST_LOADING` - 标识清单文件(manifest)开始加载
- 数据:{ url : 清单文件URL }
- `Hls.Events.MANIFEST_LOADED` - 清单文件加载完成后触发
- 数据:{ levels : [可用的质量等级列表], audioTracks : [可用的音轨列表], captions? [可用的隐藏字幕媒体列表], subtitles?: [可用的字幕轨道列表], url : 清单文件URL, stats : [加载统计信息(LoaderStats)], sessionData: [解析后的 #EXT-X-SESSION-DATA 数据], networkDetails: [用于调试的加载器特定对象(XMLHttpRequest 或 fetch 响应对象)]}
- `Hls.Events.MANIFEST_PARSED` - 清单文件解析完成后触发
- 数据:{ levels : [可用的质量等级列表 ], firstLevel : 清单中首次出现的质量等级索引, audioTracks(音轨列表), subtitleTracks(字幕轨道列表), stats(加载统计信息), audio: boolean(是否包含音频), video: boolean(是否包含视频), altAudio: boolean(是否包含备用音频) }
- `Hls.Events.LEVEL_SWITCHING` - 当请求切换质量等级时触发
- 数据:{ `level` 及等级对象属性(详见 [下方](#level) 说明) }
- `Hls.Events.LEVEL_SWITCHED` - 当质量等级切换生效后触发
- 数据:{ level : 新等级的ID }
- `Hls.Events.LEVEL_LOADING` - 当请求加载等级播放列表时触发(除非它是通过 `hls.loadSource()` 加载的唯一媒体播放列表)
- 数据:{ url : 等级播放列表URL, level : 正在加载的等级ID, deliveryDirectives: 低延迟HLS(LL-HLS)传输指令,若不支持阻塞重载则为 `null` }
- `Hls.Events.LEVEL_LOADED` - 等级播放列表加载完成后触发
- 数据:{ details : [等级详情(LevelDetails)], level : 已加载等级的ID, stats : [加载统计信息(LoadStats)] }
- `Hls.Events.LEVEL_UPDATED` - 当等级加载完成后,基于历史详情更新该等级信息时触发
- 数据:{ details : [等级详情(LevelDetails)], level : 已更新等级的ID }
- `Hls.Events.LEVEL_PTS_UPDATED` - 当解析片段后更新等级的PTS(演示时间戳)信息时触发
- 数据:{ details : [等级详情(LevelDetails)], level : 已更新等级的ID, drift: 解析最后一个片段时观察到的PTS偏移量, type(类型), start(起始时间), end(结束时间) }
- `Hls.Events.LEVELS_UPDATED` - 调用 `removeLevel()` 移除某个等级后触发
- 数据:{ levels : [可用的质量等级列表 ] }
- `Hls.Events.AUDIO_TRACKS_UPDATED` - 通知音轨列表已更新时触发
- 数据:{ audioTracks : 音轨列表 }
- `Hls.Events.AUDIO_TRACK_SWITCHING` - 当请求切换音轨时触发
- 数据:{ id : 音轨ID, type : 播放列表类型 ('AUDIO' | 'main'), url : 音轨URL }
- `Hls.Events.AUDIO_TRACK_SWITCHED` - 当音轨实际切换完成后触发
- 数据:{ id : 音轨ID }
- `Hls.Events.AUDIO_TRACK_LOADING` - 音轨开始加载时触发
- 数据:{ url : 音轨URL, id : 音轨ID }
- `Hls.Events.AUDIO_TRACK_LOADED` - 音轨加载完成后触发
- 数据:{ details : [等级详情(LevelDetails)], id : 音轨ID, stats : [加载统计信息(LoadStats)] }
- `Hls.Events.SUBTITLE_TRACKS_UPDATED` - 通知字幕轨道列表已更新时触发
- 数据:{ subtitleTracks : 字幕轨道列表 }
- `Hls.Events.SUBTITLE_TRACK_SWITCH` - 当字幕轨道切换时触发
- 数据:{ id : 字幕轨道ID, type? : 播放列表类型 ('SUBTITLES' | 'CLOSED-CAPTIONS'(隐藏字幕)), url? : 字幕轨道URL }
- `Hls.Events.SUBTITLE_TRACK_LOADING` - 字幕轨道开始加载时触发
- 数据:{ url : 字幕轨道URL, id : 字幕轨道ID } (原文此处字段描述有误,已修正为字幕相关)
- `Hls.Events.SUBTITLE_TRACK_LOADED` - 字幕轨道加载完成后触发
- 数据:{ details : [等级详情(LevelDetails)], id : 字幕轨道ID, stats : [加载统计信息(LoadStats)] }
- `Hls.Events.SUBTITLE_FRAG_PROCESSED` - 当字幕片段处理完成后触发
- 数据:{ success : boolean(处理是否成功), frag : [已处理的片段对象], error?: [字幕解析错误信息(若有)] }
- `Hls.Events.INIT_PTS_FOUND` - 当找到第一个时间戳时触发
- 数据:{ d : 解复用器ID, initPTS: 初始演示时间戳, timescale: 时间刻度, frag : 片段对象 }
- `Hls.Events.FRAG_LOADING` - 片段开始加载时触发
- 数据:{ frag : 片段对象, targetBufferTime: number | null [期望通过该片段填充的缓冲区空白时间] }
- `Hls.Events.FRAG_LOAD_PROGRESS` - [已废弃]
- `Hls.Events.FRAG_LOAD_EMERGENCY_ABORTED` - 标识因紧急降级切换而中止片段加载
- 数据:{ frag : 片段对象 }
- `Hls.Events.FRAG_LOADED` - 片段加载完成后触发
- 数据:{ frag : 片段对象, payload : 片段数据负载, stats : [加载统计信息(LoadStats)]}
- `Hls.Events.FRAG_DECRYPTED` - 片段解密完成后触发
- 数据:{ id : 解复用器ID, frag : 片段对象, payload : 片段数据负载, stats : { tstart(开始时间), tdecrypt(解密耗时)}}
- `Hls.Events.FRAG_PARSING_INIT_SEGMENT` - 当从片段中提取初始化片段(Init Segment)后触发
- 数据:{ id: 解复用器ID, frag : 片段对象, moov : MP4的moov盒数据, codecs : 解析片段时发现的编解码器信息 }
- `Hls.Events.FRAG_PARSING_USERDATA` - 当SEI(补充增强信息)文本解析完成后触发
- 数据:{ id : 解复用器ID, frag: 片段对象, samples : [ SEI样本PES包 ], details: [等级详情(LevelDetails)] }
- `Hls.Events.FRAG_PARSING_METADATA` - 当ID3元数据解析完成后触发
- 数据:{ id: 解复用器ID, frag : 片段对象, samples : [ ID3 PES包 - PTS和DTS时间戳为相对时间,单位为秒], details: [等级详情(LevelDetails)] }
- `Hls.Events.FRAG_PARSING_DATA` - [已废弃]
- `Hls.Events.FRAG_PARSED` - 片段解析完成后触发
- 数据:{ frag : 片段对象, partIndex(分片索引) }
- `Hls.Events.FRAG_BUFFERED` - 当片段重新封装后的MP4盒数据全部追加到SourceBuffer后触发
- 数据:{ id: 解复用器ID, frag : 片段对象, stats : [加载统计信息(LoadStats)] }
- `Hls.Events.FRAG_CHANGED` - 当与当前视频播放位置匹配的片段发生变化时触发
- 数据:{ id : 解复用器ID, frag : 片段对象 }
- `Hls.Events.FPS_DROP` - 当最近监控周期内的帧率下降超过设定阈值时触发
- 数据:{ curentDropped : 最近监控周期内的丢帧数, currentDecoded : 最近监控周期内的解码帧数, totalDroppedFrames : 该视频元素的总丢帧数 }(原文curentDropped拼写有误,已保留原字段名)
- `Hls.Events.FPS_DROP_LEVEL_CAPPING` - 当帧率下降触发自动质量等级限制时触发
- 数据:{ level: 帧率控制器建议的新自动等级限制值, droppedLevel : 因丢帧过多将被限制的等级 }
- `Hls.Events.ERROR` - 错误事件标识
- 数据:{ type : 错误类型, details : 错误详情, fatal : 错误是否致命, 其他错误相关数据 }
- `Hls.Events.DESTROYING` - 当 hls.js 实例开始销毁时触发。与 `MEDIA_DETACHED` 的区别在于:例如为了处理插播广告(mid-rolls),可能需要分离并重新附加视频到 hls.js 实例
- 数据:{ }
- `Hls.Events.KEY_LOADING` - 解密密钥开始加载时触发
- 数据:{ frag : 片段对象 }
- `Hls.Events.KEY_LOADED` - 解密密钥加载完成后触发
- 数据:{ frag : 片段对象 }
- `Hls.Events.STREAM_STATE_TRANSITION` - [已废弃]
- `Hls.Events.NON_NATIVE_TEXT_TRACKS_FOUND` - 当 `renderTextTracksNatively` 设为 `false` 时,发现新的隐藏字幕或字幕轨道时触发(替代向视频元素添加 TextTrack 的行为)
- 数据:{ tracks: 轨道数组<{ label(轨道标签), kind(轨道类型), default(是否默认轨道), subtitleTrack(字幕轨道对象)}> }
- `Hls.Events.CUES_PARSED` - 当 `renderTextTracksNatively` 设为 `false` 时,解析到新的隐藏字幕或字幕提示(cues)时触发
- 数据:{ type(类型), cues(提示信息列表), track(所属轨道) }总结
到此这篇关于hls.js初始化、钩子函数及执行关系超的文章就介绍到这了,更多相关hls.js初始化、钩子函数及执行关系内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
JavaScript中call和apply的用法、区别及应用场景
这篇文章主要介绍了JavaScript中的call和apply方法,它们都用于改变函数执行时的this指向,文中通过代码介绍的非常详细,需要的朋友可以参考下2025-03-03
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
在火狐下 可以正常取得时间,在IE7下 却是 NaN。纠结老长时间,放弃了new date 然后再老外的论坛中找了一段段代码可以兼容所有浏览器的格式化日期代码2012-03-03


最新评论