Yard


hlsjs源码执行事件流程

hlsjs 以 Event 作为核心来进行各个模块的调度

  onEventGeneric (event: string, data: any) {
    let eventToFunction = function (event: string, data: any) {
      let funcName = 'on' + event.replace('hls', '');
      if (typeof this[funcName] !== 'function') {
        throw new Error(`Event ${event} has no generic handler in this ${this.constructor.name} class (tried ${funcName})`);
      }

      return this[funcName].bind(this, data);
    };
    try {
      eventToFunction.call(this, event, data).call();
    } catch (err) {
      logger.error(`An internal error happened while handling event ${event}. Error message: "${err.message}". Here is a stacktrace:`, err);
      this.hls.trigger(Event.ERROR, { type: ErrorTypes.OTHER_ERROR, details: ErrorDetails.INTERNAL_EXCEPTION, fatal: false, event: event, err: err });
    }
  }

this 是每一个使用当前 event 的类,将 hls 事件转化成类原型上的 onXXX 函数执行

以下是 hls 事件触发栈

PlaylistLoader hlsManifestLoading
StreamController hlsManifestLoading
BufferController hlsBufferReset
AudioStreamController hlsBufferReset
AudioTrackController hlsManifestLoading
TimelineController hlsManifestLoading
BufferController hlsMediaAttaching
CapLevelController hlsMediaAttaching
FPSController hlsMediaAttaching
TimelineController hlsMediaAttaching
ID3TrackController hlsMediaAttached
StreamController hlsMediaAttached
AudioStreamController hlsMediaAttached
SubtitleTrackController hlsMediaAttached
EMEController hlsMediaAttached
SubtitleStreamController hlsMediaAttached
LevelController hlsManifestLoaded
BufferController hlsManifestParsed
CapLevelController hlsManifestParsed
StreamController hlsManifestParsed
AudioTrackController hlsManifestParsed
AudioStreamController hlsAudioTracksUpdated
EMEController hlsManifestParsed
SubtitleTrackController hlsManifestLoaded
SubtitleStreamController hlsSubtitleTracksUpdated
TimelineController hlsManifestLoaded
LevelController hlsLevelLoaded
StreamController hlsLevelLoaded
BufferController hlsLevelUpdated
SubtitleStreamController hlsLevelUpdated
KeyLoader hlsKeyLoading
AudioTrackController hlsLevelLoaded
StreamController hlsKeyLoaded
AbrController hlsFragLoading
FragmentLoader hlsFragLoading
AudioStreamController hlsKeyLoaded
SubtitleStreamController hlsKeyLoaded
AbrController hlsFragLoaded
LevelController hlsFragLoaded
FragmentTracker hlsFragLoaded
StreamController hlsFragLoaded
AudioStreamController hlsFragLoaded
SubtitleStreamController hlsFragLoaded
TimelineController hlsFragLoaded
TimelineController hlsFragDecrypted
AudioStreamController hlsInitPtsFound
TimelineController hlsInitPtsFound
StreamController hlsFragParsingInitSegment
BufferController hlsBufferCodecs
StreamController hlsBufferCreated
AudioStreamController hlsBufferCreated
CapLevelController hlsBufferCodecs
2 BufferController hlsBufferAppending
AudioStreamController hlsFragParsingInitSegment
StreamController hlsFragParsingData
BufferController hlsLevelPtsUpdated
2 BufferController hlsBufferAppending
AudioStreamController hlsFragParsingData
StreamController hlsFragParsingData
BufferController hlsLevelPtsUpdated
2 BufferController hlsBufferAppending
AudioStreamController hlsFragParsingData
TimelineController hlsFragParsingUserdata
StreamController hlsFragParsed
AudioStreamController hlsFragParsed
FragmentTracker hlsBufferAppended
StreamController hlsBufferAppended
AudioStreamController hlsBufferAppended
FragmentTracker hlsBufferAppended
StreamController hlsBufferAppended
AudioStreamController hlsBufferAppended
FragmentTracker hlsBufferAppended
StreamController hlsBufferAppended
AudioStreamController hlsBufferAppended
FragmentTracker hlsBufferAppended
StreamController hlsBufferAppended
AudioStreamController hlsBufferAppended
FragmentTracker hlsBufferAppended
StreamController hlsBufferAppended
AudioStreamController hlsBufferAppended
FragmentTracker hlsBufferAppended
StreamController hlsBufferAppended
AbrController hlsFragBuffered
FragmentTracker hlsFragBuffered
BufferController hlsBufferEos
AudioStreamController hlsBufferAppended

前面带 2 的为多次触发

hls对象解析

第一层API Playlist

第二层API Level

第三层API Fragment 包括 视频 音频 字幕

第四层API Sample

第五层API PTS DTS 具体帧的DATA

把这些data buffer push到New MediaSource

接着将媒体源指向source Media.src = New MediaSource