最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

hls.js初始化、鉤子函數(shù)及執(zhí)行關(guān)系超完全解析(附代碼)

 更新時間:2025年11月25日 11:05:52   作者:鋒通科技  
HLS.js是一個用于在瀏覽器中播放HTTP實時流(HLS,HTTP Live Streaming)的JavaScript庫,HLS是一種由Apple提出的流媒體協(xié)議,廣泛用于視頻直播和點播,這篇文章主要介紹了hls.js初始化、鉤子函數(shù)及執(zhí)行關(guān)系超完全解析的相關(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_ATTACHEDMediaSource 成功綁定到視頻元素后{ media: HTMLVideoElement }media:已綁定的視頻元素
MEDIA_DETACHING調(diào)用 detachMedia() 前,MediaSource 解綁前{ }無額外參數(shù)
MEDIA_DETACHEDMediaSource 從視頻元素解綁后{ }無額外參數(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: anynull }`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: numbernull }`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_CREATEDSourceBuffer 創(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)文章

最新評論

河东区| 南召县| 东乌珠穆沁旗| 白沙| 会昌县| 陈巴尔虎旗| 剑川县| 抚顺县| 淳安县| 吐鲁番市| 临安市| 霍邱县| 乐业县| 新闻| 德昌县| 神池县| 沽源县| 平昌县| 上犹县| 邵阳县| 平山县| 宿松县| 电白县| 莱州市| 石台县| 靖州| 辽中县| 长寿区| 来安县| 策勒县| 沈丘县| 兴宁市| 浮山县| 武隆县| 台北县| 平乐县| 武夷山市| 开原市| 新干县| 靖边县| 静乐县|