hls.js初始化、鉤子函數(shù)及執(zhí)行關(guān)系超完全解析(附代碼)
前言
基于官方 hls.js 1.4.14的API 文檔,全面修正、梳理 hls.js 正確的初始化流程、官方鉤子函數(shù)(含精準參數(shù))及事件執(zhí)行邏輯,確保所有內(nèi)容與官方定義完全一致。
一、hls.js 初始化(官方標準流程)
初始化核心是「創(chuàng)建實例→綁定媒體元素→加載資源」,流程與官方 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. 配置參數(shù)(官方常用配置,按需調(diào)整)
const hlsConfig = {
startLevel: -1, // 自動選擇清晰度
maxBufferLength: 30, // 視頻最大緩沖時長(秒)
enableWorker: true, // 啟用 Web Worker 解析
backBufferLength: 90 // 后臺緩沖保留時長(秒)
};
// 2. 創(chuàng)建 hls 實例
const hls = new Hls(hlsConfig);
const video = document.getElementById('videoPlayer');
// 3. 綁定媒體元素(觸發(fā) MEDIA_ATTACHING → MEDIA_ATTACHED)
hls.attachMedia(video);
// 4. 監(jiān)聽媒體綁定成功事件,加載資源
hls.on(Hls.Events.MEDIA_ATTACHED, () => {
console.log('媒體元素綁定成功,加載 HLS 流');
hls.loadSource('https://example.com/stream/main.m3u8'); // 加載主 m3u8
});
// 5. 可選:監(jiān)聽初始化相關(guān)事件
hls.on(Hls.Events.MANIFEST_PARSED, (event, data) => {
console.log('主 m3u8 解析完成,可用清晰度:', data.levels.length);
video.play().catch(err => console.log('自動播放失敗:', err));
});
// 6. 錯誤處理(按官方錯誤參數(shù)結(jié)構(gòu))
hls.on(Hls.Events.ERROR, (event, data) => {
if (data.fatal) {
switch (data.type) {
case Hls.ErrorTypes.NETWORK_ERROR:
console.log('網(wǎng)絡(luò)錯誤:', data.details, data.url);
hls.startLoad(); // 重試加載
break;
case Hls.ErrorTypes.MEDIA_ERROR:
console.log('媒體錯誤:', data.details);
hls.recoverMediaError(); // 恢復(fù)媒體錯誤
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:解析后的清晰度列表(數(shù)組,每個元素為 Level 對象,含bitrate/width/height等)hls.currentLevel:當(dāng)前激活的清晰度 ID(-1 = 自動)hls.audioTracks:可用音頻軌道列表hls.subtitleTracks:可用字幕軌道列表hls.state:實例狀態(tài)(IDLE/LOADING/READY/ERROR)
二、官方鉤子函數(shù)(事件)權(quán)威分類詳解
所有事件均基于你提供的官方文檔,按「功能場景」分類,包含「觸發(fā)時機」「官方參數(shù)結(jié)構(gòu)」「參數(shù)意義」三部分,無任何自定義或錯誤參數(shù)。
1. 生命周期事件(實例 / 媒體綁定狀態(tài))
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 |
|---|---|---|---|
MEDIA_ATTACHING | 調(diào)用 attachMedia() 后,MediaSource 綁定前 | { media: HTMLVideoElement } | media:待綁定的視頻元素 |
MEDIA_ATTACHED | MediaSource 成功綁定到視頻元素后 | { media: HTMLVideoElement } | media:已綁定的視頻元素 |
MEDIA_DETACHING | 調(diào)用 detachMedia() 前,MediaSource 解綁前 | { } | 無額外參數(shù) |
MEDIA_DETACHED | MediaSource 從視頻元素解綁后 | { } | 無額外參數(shù) |
DESTROYING | 調(diào)用 destroy() 后,實例開始銷毀時 | { } | 區(qū)別于 MEDIA_DETACHED,支持解綁后重新綁定 |
2. 資源加載事件(m3u8 / 清晰度 / 音頻軌道)
(1)Manifest(主 m3u8)相關(guān)
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 |
|---|---|---|---|
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:加載統(tǒng)計(耗時、狀態(tài)碼等);- networkDetails:調(diào)試用網(wǎng)絡(luò)詳情(XHR/fetch 響應(yīng)) |
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(清晰度)相關(guān)
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 | |
|---|---|---|---|---|
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:加載統(tǒng)計信息 | |
LEVEL_UPDATED | 清晰度詳情基于歷史數(shù)據(jù)更新后 | { details: LevelDetails, level: number } | details:更新后的清晰度詳情 | |
LEVEL_SWITCHING | 發(fā)起清晰度切換請求時 | { level: number, ...Level對象屬性 } | - level:目標清晰度 ID;- 含 Level 對象所有屬性(如 bitrate/width 等) | |
LEVEL_SWITCHED | 清晰度切換生效時 | { level: number } | level:最終激活的清晰度 ID | |
LEVELS_UPDATED | 調(diào)用 removeLevel() 移除清晰度后 | { levels: Level[] } | levels:更新后的可用清晰度列表 |
(3)音頻 / 字幕軌道相關(guān)
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 | |
|---|---|---|---|---|
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 | 發(fā)起音頻軌道切換請求時 | `{ 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)處理事件(核心)
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 | |
|---|---|---|---|---|
FRAG_LOADING | 開始請求某個 ts 片段時 | `{ frag: Fragment, targetBufferTime: number | null }` | - frag:片段對象(含 url/start/duration 等);- targetBufferTime:該片段要填充的未緩沖時間點(null 為無特定目標) |
FRAG_LOAD_EMERGENCY_ABORTED | 緊急降清晰度時,中斷片段加載 | { frag: Fragment } | frag:被中斷加載的片段對象 | |
FRAG_LOADED | 片段加載完成(獲取二進制數(shù)據(jù)) | { frag: Fragment, payload: ArrayBuffer, stats: LoadStats } | - payload:片段原始二進制數(shù)據(jù);- stats:加載統(tǒng)計(耗時、字節(jié)數(shù)等) | |
FRAG_DECRYPTED | 加密片段解密完成后 | { id: number, frag: Fragment, payload: ArrayBuffer, stats: { tstart: number, tdecrypt: number } } | - id:解復(fù)用器 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:解復(fù)用器 ID;stats:寫入統(tǒng)計信息 | |
FRAG_CHANGED | 當(dāng)前播放位置匹配的片段變更時 | { id: number, frag: Fragment } | frag:新匹配的片段對象 |
4. 緩沖管理事件
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 |
|---|---|---|---|
BUFFER_RESET | 緩沖即將重置時(如清晰度切換) | { } | 無額外參數(shù) |
BUFFER_CODECS | 確定緩沖所需的音視頻編碼后 | { audio?: Track[], video?: Track[] } | Track:含 id/codec/container 等屬性 |
BUFFER_CREATED | SourceBuffer 創(chuàng)建完成后 | { 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:待寫入的片段數(shù)據(jù) |
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 | 流結(jié)束,通知緩沖不再接收數(shù)據(jù) | { type: SourceBufferName } | type:結(jié)束的緩沖類型 |
BACK_BUFFER_REACHED | 達到 backBufferLength 配置的后臺緩沖時長 | { bufferEnd: number } | bufferEnd:當(dāng)前緩沖的結(jié)束時間 |
5. 其他關(guān)鍵事件
| 事件名 | 觸發(fā)時機 | 官方參數(shù)結(jié)構(gòu) | 參數(shù)意義 |
|---|---|---|---|
KEY_LOADING | 開始請求解密密鑰時 | { frag: Fragment } | frag:需要解密的片段對象 |
KEY_LOADED | 解密密鑰加載完成后 | { frag: Fragment } | frag:對應(yīng)需要解密的片段對象 |
FPS_DROP | 監(jiān)控周期內(nèi)幀率下降超過閾值 | { curentDropped: number, currentDecoded: number, totalDroppedFrames: number } | - curentDropped:當(dāng)前周期丟幀數(shù);- totalDroppedFrames:總丟幀數(shù) |
ERROR | 發(fā)生錯誤時 | { type: string, details: string, fatal: boolean, ...其他錯誤相關(guān)數(shù)據(jù) } | - type:錯誤類型(networkError/mediaError 等);- details:錯誤詳情;- fatal:是否為致命錯誤 |
三、官方鉤子函數(shù)執(zhí)行關(guān)系(事件鏈)
所有事件嚴格遵循官方定義的觸發(fā)順序,以下為核心流程的事件鏈:
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 → (繼續(xù)播放)
3. 片段加載循環(huán)流程(播放中)
plaintext
FRAG_CHANGED → FRAG_LOADING → FRAG_LOADED → (加密片段觸發(fā) KEY_LOADING → KEY_LOADED → FRAG_DECRYPTED) → FRAG_PARSED → BUFFER_APPENDING → BUFFER_APPENDED → FRAG_BUFFERED → (循環(huán)直到播放結(jié)束或切換清晰度)
4. 錯誤處理流程
plaintext
ERROR(fatal: true) → (根據(jù)錯誤類型分支) - 網(wǎng)絡(luò)錯誤:MANIFEST_LOADING/FRAG_LOADING(重試) - 媒體錯誤:BUFFER_RESET → FRAG_LOADING(重新加載片段) - 幀率下降:FPS_DROP → FPS_DROP_LEVEL_CAPPING → LEVEL_SWITCHING(降清晰度) → 錯誤恢復(fù) → 回到對應(yīng)流程繼續(xù)播放
5. 銷毀流程
plaintext
destroy() → DESTROYING → MEDIA_DETACHING → MEDIA_DETACHED
四、官方 API 核心使用示例(修正后)
基于官方參數(shù)結(jié)構(gòu),提供高頻場景的正確用法:
1. 監(jiān)聽片段加載(含 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 + ' 字節(jié)');
console.log('加載耗時:', data.stats.loadTime + ' 毫秒');
});
2. 監(jiān)聽清晰度切換
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('清晰度切換完成,當(dāng)前 ID =', data.level);
const currentLevel = hls.levels[data.level];
console.log('當(dāng)前清晰度分辨率:', currentLevel.width + 'x' + currentLevel.height);
});
3. 加密片段密鑰加載監(jiān)聽
javascript
hls.on(Hls.Events.KEY_LOADING, (event, data) => {
console.log('開始加載密鑰,對應(yīng)片段:', data.frag.url);
});
hls.on(Hls.Events.KEY_LOADED, (event, data) => {
console.log('密鑰加載完成,片段即將解密:', data.frag.url);
});
五、核心總結(jié)(官方 API 關(guān)鍵點)
- 參數(shù)準確性:所有事件參數(shù)以官方文檔為準,如
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「已廢棄」,避免使用。 - 依賴關(guān)系:后續(xù)事件依賴前置事件完成(如
FRAG_PARSED必須在FRAG_LOADED之后),不可跨步驟監(jiān)聽。 - 錯誤處理:
fatal: true的錯誤必須處理,否則播放中斷,可通過data.type/data.details定位問題。
六、附錄(官方API鉤子說明部分)
完整事件列表如下:
- `Hls.Events.MEDIA_ATTACHING` - 在 MediaSource 附加到媒體元素之前觸發(fā)
- 數(shù)據(jù):{ media: 媒體元素 }
- `Hls.Events.MEDIA_ATTACHED` - 當(dāng) MediaSource 成功附加到媒體元素時觸發(fā)
- 數(shù)據(jù):{ media: 媒體元素 }
- `Hls.Events.MEDIA_DETACHING` - 在 MediaSource 從媒體元素分離之前觸發(fā)
- 數(shù)據(jù):{ }
- `Hls.Events.MEDIA_DETACHED` - 當(dāng) MediaSource 從媒體元素分離后觸發(fā)
- 數(shù)據(jù):{ }
- `Hls.Events.BUFFER_RESET` - 當(dāng)緩沖區(qū)即將重置時觸發(fā)
- 數(shù)據(jù):{ }
- `Hls.Events.BUFFER_CODECS` - 當(dāng)確定需要為其創(chuàng)建緩沖區(qū)以推入數(shù)據(jù)的編解碼器時觸發(fā)
- 數(shù)據(jù):{ audio? : `[軌道對象數(shù)組]`, video? : `[軌道對象數(shù)組]` }
- `Hls.Events.BUFFER_CREATED` - 當(dāng)源緩沖區(qū)(SourceBuffer)創(chuàng)建完成時觸發(fā)
- 數(shù)據(jù):{ tracks : { audio? : `[軌道對象數(shù)組]`, video? : `[軌道對象數(shù)組]`, audiovideo?: `[軌道對象數(shù)組]` } }
接口 Track { id: 'audio' | 'main'(軌道類型標識), buffer?: SourceBuffer(關(guān)聯(lián)的源緩沖區(qū)), container: string(容器格式), codec?: string(編解碼器類型), initSegment?: Uint8Array(初始化片段數(shù)據(jù)), levelCodec?: string(層級編解碼器信息), metadata?: any(元數(shù)據(jù)) }
- `Hls.Events.BUFFER_APPENDING` - 當(dāng)向緩沖區(qū)追加片段時觸發(fā)
- 數(shù)據(jù):{ parent(父對象), type(類型), frag(片段對象), part(分片對象), chunkMeta(分片元數(shù)據(jù)), data(數(shù)據(jù)內(nèi)容) }
- `Hls.Events.BUFFER_APPENDED` - 當(dāng)媒體片段成功追加到緩沖區(qū)后觸發(fā)
- 數(shù)據(jù):{ parent : 觸發(fā) `BUFFER_APPENDING` 的播放列表類型, type(類型), frag(片段對象), part(分片對象), chunkMeta(分片元數(shù)據(jù)), timeRanges : { video?: 視頻時間范圍, audio?: 音頻時間范圍, audiovideo?: 音視頻合并時間范圍 } }
- `Hls.Events.BUFFER_EOS` - 當(dāng)流結(jié)束且需通知媒體緩沖區(qū)不再有新數(shù)據(jù)時觸發(fā)
- 數(shù)據(jù):{ type: 源緩沖區(qū)名稱(SourceBufferName) }
- `Hls.Events.BUFFER_FLUSHING` - 當(dāng)媒體緩沖區(qū)需要刷新時觸發(fā)
- 數(shù)據(jù):{ startOffset(起始偏移量), endOffset(結(jié)束偏移量), type: 源緩沖區(qū)名稱(SourceBufferName) }
- `Hls.Events.BUFFER_FLUSHED` - 當(dāng)媒體緩沖區(qū)刷新完成后觸發(fā)
- 數(shù)據(jù):{ type: 源緩沖區(qū)名稱(SourceBufferName) }
- `Hls.Events.BACK_BUFFER_REACHED` - 當(dāng)達到 [backBufferLength](#backbufferlength) 配置項定義的后緩沖區(qū)閾值時觸發(fā)
- 數(shù)據(jù):{ bufferEnd: number(緩沖區(qū)結(jié)束位置時間戳) }
- `Hls.Events.MANIFEST_LOADING` - 標識清單文件(manifest)開始加載
- 數(shù)據(jù):{ url : 清單文件URL }
- `Hls.Events.MANIFEST_LOADED` - 清單文件加載完成后觸發(fā)
- 數(shù)據(jù):{ levels : [可用的質(zhì)量等級列表], audioTracks : [可用的音軌列表], captions? [可用的隱藏字幕媒體列表], subtitles?: [可用的字幕軌道列表], url : 清單文件URL, stats : [加載統(tǒng)計信息(LoaderStats)], sessionData: [解析后的 #EXT-X-SESSION-DATA 數(shù)據(jù)], networkDetails: [用于調(diào)試的加載器特定對象(XMLHttpRequest 或 fetch 響應(yīng)對象)]}
- `Hls.Events.MANIFEST_PARSED` - 清單文件解析完成后觸發(fā)
- 數(shù)據(jù):{ levels : [可用的質(zhì)量等級列表 ], firstLevel : 清單中首次出現(xiàn)的質(zhì)量等級索引, audioTracks(音軌列表), subtitleTracks(字幕軌道列表), stats(加載統(tǒng)計信息), audio: boolean(是否包含音頻), video: boolean(是否包含視頻), altAudio: boolean(是否包含備用音頻) }
- `Hls.Events.LEVEL_SWITCHING` - 當(dāng)請求切換質(zhì)量等級時觸發(fā)
- 數(shù)據(jù):{ `level` 及等級對象屬性(詳見 [下方](#level) 說明) }
- `Hls.Events.LEVEL_SWITCHED` - 當(dāng)質(zhì)量等級切換生效后觸發(fā)
- 數(shù)據(jù):{ level : 新等級的ID }
- `Hls.Events.LEVEL_LOADING` - 當(dāng)請求加載等級播放列表時觸發(fā)(除非它是通過 `hls.loadSource()` 加載的唯一媒體播放列表)
- 數(shù)據(jù):{ url : 等級播放列表URL, level : 正在加載的等級ID, deliveryDirectives: 低延遲HLS(LL-HLS)傳輸指令,若不支持阻塞重載則為 `null` }
- `Hls.Events.LEVEL_LOADED` - 等級播放列表加載完成后觸發(fā)
- 數(shù)據(jù):{ details : [等級詳情(LevelDetails)], level : 已加載等級的ID, stats : [加載統(tǒng)計信息(LoadStats)] }
- `Hls.Events.LEVEL_UPDATED` - 當(dāng)?shù)燃壖虞d完成后,基于歷史詳情更新該等級信息時觸發(fā)
- 數(shù)據(jù):{ details : [等級詳情(LevelDetails)], level : 已更新等級的ID }
- `Hls.Events.LEVEL_PTS_UPDATED` - 當(dāng)解析片段后更新等級的PTS(演示時間戳)信息時觸發(fā)
- 數(shù)據(jù):{ details : [等級詳情(LevelDetails)], level : 已更新等級的ID, drift: 解析最后一個片段時觀察到的PTS偏移量, type(類型), start(起始時間), end(結(jié)束時間) }
- `Hls.Events.LEVELS_UPDATED` - 調(diào)用 `removeLevel()` 移除某個等級后觸發(fā)
- 數(shù)據(jù):{ levels : [可用的質(zhì)量等級列表 ] }
- `Hls.Events.AUDIO_TRACKS_UPDATED` - 通知音軌列表已更新時觸發(fā)
- 數(shù)據(jù):{ audioTracks : 音軌列表 }
- `Hls.Events.AUDIO_TRACK_SWITCHING` - 當(dāng)請求切換音軌時觸發(fā)
- 數(shù)據(jù):{ id : 音軌ID, type : 播放列表類型 ('AUDIO' | 'main'), url : 音軌URL }
- `Hls.Events.AUDIO_TRACK_SWITCHED` - 當(dāng)音軌實際切換完成后觸發(fā)
- 數(shù)據(jù):{ id : 音軌ID }
- `Hls.Events.AUDIO_TRACK_LOADING` - 音軌開始加載時觸發(fā)
- 數(shù)據(jù):{ url : 音軌URL, id : 音軌ID }
- `Hls.Events.AUDIO_TRACK_LOADED` - 音軌加載完成后觸發(fā)
- 數(shù)據(jù):{ details : [等級詳情(LevelDetails)], id : 音軌ID, stats : [加載統(tǒng)計信息(LoadStats)] }
- `Hls.Events.SUBTITLE_TRACKS_UPDATED` - 通知字幕軌道列表已更新時觸發(fā)
- 數(shù)據(jù):{ subtitleTracks : 字幕軌道列表 }
- `Hls.Events.SUBTITLE_TRACK_SWITCH` - 當(dāng)字幕軌道切換時觸發(fā)
- 數(shù)據(jù):{ id : 字幕軌道ID, type? : 播放列表類型 ('SUBTITLES' | 'CLOSED-CAPTIONS'(隱藏字幕)), url? : 字幕軌道URL }
- `Hls.Events.SUBTITLE_TRACK_LOADING` - 字幕軌道開始加載時觸發(fā)
- 數(shù)據(jù):{ url : 字幕軌道URL, id : 字幕軌道ID } (原文此處字段描述有誤,已修正為字幕相關(guān))
- `Hls.Events.SUBTITLE_TRACK_LOADED` - 字幕軌道加載完成后觸發(fā)
- 數(shù)據(jù):{ details : [等級詳情(LevelDetails)], id : 字幕軌道ID, stats : [加載統(tǒng)計信息(LoadStats)] }
- `Hls.Events.SUBTITLE_FRAG_PROCESSED` - 當(dāng)字幕片段處理完成后觸發(fā)
- 數(shù)據(jù):{ success : boolean(處理是否成功), frag : [已處理的片段對象], error?: [字幕解析錯誤信息(若有)] }
- `Hls.Events.INIT_PTS_FOUND` - 當(dāng)找到第一個時間戳?xí)r觸發(fā)
- 數(shù)據(jù):{ d : 解復(fù)用器ID, initPTS: 初始演示時間戳, timescale: 時間刻度, frag : 片段對象 }
- `Hls.Events.FRAG_LOADING` - 片段開始加載時觸發(fā)
- 數(shù)據(jù):{ frag : 片段對象, targetBufferTime: number | null [期望通過該片段填充的緩沖區(qū)空白時間] }
- `Hls.Events.FRAG_LOAD_PROGRESS` - [已廢棄]
- `Hls.Events.FRAG_LOAD_EMERGENCY_ABORTED` - 標識因緊急降級切換而中止片段加載
- 數(shù)據(jù):{ frag : 片段對象 }
- `Hls.Events.FRAG_LOADED` - 片段加載完成后觸發(fā)
- 數(shù)據(jù):{ frag : 片段對象, payload : 片段數(shù)據(jù)負載, stats : [加載統(tǒng)計信息(LoadStats)]}
- `Hls.Events.FRAG_DECRYPTED` - 片段解密完成后觸發(fā)
- 數(shù)據(jù):{ id : 解復(fù)用器ID, frag : 片段對象, payload : 片段數(shù)據(jù)負載, stats : { tstart(開始時間), tdecrypt(解密耗時)}}
- `Hls.Events.FRAG_PARSING_INIT_SEGMENT` - 當(dāng)從片段中提取初始化片段(Init Segment)后觸發(fā)
- 數(shù)據(jù):{ id: 解復(fù)用器ID, frag : 片段對象, moov : MP4的moov盒數(shù)據(jù), codecs : 解析片段時發(fā)現(xiàn)的編解碼器信息 }
- `Hls.Events.FRAG_PARSING_USERDATA` - 當(dāng)SEI(補充增強信息)文本解析完成后觸發(fā)
- 數(shù)據(jù):{ id : 解復(fù)用器ID, frag: 片段對象, samples : [ SEI樣本PES包 ], details: [等級詳情(LevelDetails)] }
- `Hls.Events.FRAG_PARSING_METADATA` - 當(dāng)ID3元數(shù)據(jù)解析完成后觸發(fā)
- 數(shù)據(jù):{ id: 解復(fù)用器ID, frag : 片段對象, samples : [ ID3 PES包 - PTS和DTS時間戳為相對時間,單位為秒], details: [等級詳情(LevelDetails)] }
- `Hls.Events.FRAG_PARSING_DATA` - [已廢棄]
- `Hls.Events.FRAG_PARSED` - 片段解析完成后觸發(fā)
- 數(shù)據(jù):{ frag : 片段對象, partIndex(分片索引) }
- `Hls.Events.FRAG_BUFFERED` - 當(dāng)片段重新封裝后的MP4盒數(shù)據(jù)全部追加到SourceBuffer后觸發(fā)
- 數(shù)據(jù):{ id: 解復(fù)用器ID, frag : 片段對象, stats : [加載統(tǒng)計信息(LoadStats)] }
- `Hls.Events.FRAG_CHANGED` - 當(dāng)與當(dāng)前視頻播放位置匹配的片段發(fā)生變化時觸發(fā)
- 數(shù)據(jù):{ id : 解復(fù)用器ID, frag : 片段對象 }
- `Hls.Events.FPS_DROP` - 當(dāng)最近監(jiān)控周期內(nèi)的幀率下降超過設(shè)定閾值時觸發(fā)
- 數(shù)據(jù):{ curentDropped : 最近監(jiān)控周期內(nèi)的丟幀數(shù), currentDecoded : 最近監(jiān)控周期內(nèi)的解碼幀數(shù), totalDroppedFrames : 該視頻元素的總丟幀數(shù) }(原文curentDropped拼寫有誤,已保留原字段名)
- `Hls.Events.FPS_DROP_LEVEL_CAPPING` - 當(dāng)幀率下降觸發(fā)自動質(zhì)量等級限制時觸發(fā)
- 數(shù)據(jù):{ level: 幀率控制器建議的新自動等級限制值, droppedLevel : 因丟幀過多將被限制的等級 }
- `Hls.Events.ERROR` - 錯誤事件標識
- 數(shù)據(jù):{ type : 錯誤類型, details : 錯誤詳情, fatal : 錯誤是否致命, 其他錯誤相關(guān)數(shù)據(jù) }
- `Hls.Events.DESTROYING` - 當(dāng) hls.js 實例開始銷毀時觸發(fā)。與 `MEDIA_DETACHED` 的區(qū)別在于:例如為了處理插播廣告(mid-rolls),可能需要分離并重新附加視頻到 hls.js 實例
- 數(shù)據(jù):{ }
- `Hls.Events.KEY_LOADING` - 解密密鑰開始加載時觸發(fā)
- 數(shù)據(jù):{ frag : 片段對象 }
- `Hls.Events.KEY_LOADED` - 解密密鑰加載完成后觸發(fā)
- 數(shù)據(jù):{ frag : 片段對象 }
- `Hls.Events.STREAM_STATE_TRANSITION` - [已廢棄]
- `Hls.Events.NON_NATIVE_TEXT_TRACKS_FOUND` - 當(dāng) `renderTextTracksNatively` 設(shè)為 `false` 時,發(fā)現(xiàn)新的隱藏字幕或字幕軌道時觸發(fā)(替代向視頻元素添加 TextTrack 的行為)
- 數(shù)據(jù):{ tracks: 軌道數(shù)組<{ label(軌道標簽), kind(軌道類型), default(是否默認軌道), subtitleTrack(字幕軌道對象)}> }
- `Hls.Events.CUES_PARSED` - 當(dāng) `renderTextTracksNatively` 設(shè)為 `false` 時,解析到新的隱藏字幕或字幕提示(cues)時觸發(fā)
- 數(shù)據(jù):{ type(類型), cues(提示信息列表), track(所屬軌道) }總結(jié)
到此這篇關(guān)于hls.js初始化、鉤子函數(shù)及執(zhí)行關(guān)系超的文章就介紹到這了,更多相關(guān)hls.js初始化、鉤子函數(shù)及執(zhí)行關(guān)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript高級程序設(shè)計 讀書筆記之十 本地對象Date日期
本地對象Date日期操作實現(xiàn)方法,需要的朋友可以參考下2012-02-02
e.target與e.currentTarget對象的使用區(qū)別詳解
這篇文章主要為大家介紹了e.target與e.currentTarget的使用區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
JS實現(xiàn)移動端點擊按鈕復(fù)制文本內(nèi)容
本文通過實例代碼給大家介紹了移動端點擊按鈕復(fù)制文本內(nèi)容 ,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
微信小程序?qū)崿F(xiàn)上拉加載功能示例【加載更多數(shù)據(jù)/觸底加載/點擊加載更多數(shù)據(jù)】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)上拉加載功能,結(jié)合實例形式分析了微信小程序加載更多數(shù)據(jù)、觸底加載或點擊加載更多數(shù)據(jù)的相關(guān)實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2020-05-05
細品javascript 尋址,閉包,對象模型和相關(guān)問題
似乎某些程序員的集合是不相交的,就好像JS程序員和玩編譯原理和CPU指令的匯編程序員就幾乎沒有交叉。前些日子討論的火熱的“作用域鏈”問題,說白了就是尋址問題,不過,這個在C中十分簡單的問題卻被JS這個動態(tài)語言弄得很復(fù)雜。2009-04-04
uni-app配置APP自定義頂部標題欄設(shè)置方法與注意事項
相信很多小伙伴在使用uniapp進行多端開發(fā)的時候,在面對一些業(yè)務(wù)需求的時候,uniapp給我們提供的默認導(dǎo)航欄已經(jīng)不能滿足我們的業(yè)務(wù)需求了,這篇文章主要給大家介紹了關(guān)于uni-app配置APP自定義頂部標題欄設(shè)置方法與注意事項的相關(guān)資料,需要的朋友可以參考下2022-07-07
淺析JavaScript函數(shù)的調(diào)用模式
這篇文章主要為大家詳細介紹了JavaScript函數(shù)的調(diào)用模式,包括方法調(diào)用模式,構(gòu)造器調(diào)用模式,apply/call調(diào)用模式,感興趣的小伙伴們可以參考一下2016-08-08
JS處理數(shù)據(jù)四舍五入(tofixed與round的區(qū)別詳解)
下面小編就為大家?guī)硪黄狫S處理數(shù)據(jù)四舍五入(tofixed與round的區(qū)別詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10

