async _loadSegment (segLoader, seg, loadInit) {
    let map
    let key
    let keyIv
    let mapKey
    let mapKeyIv
    const toLoad = []

    this.hls.emit(EVENT.LOAD_START, { url: seg.url })
    toLoad[0] = segLoader.load(seg.url)
    if (loadInit && seg.initSegment) {
      const mapUrl = seg.initSegment.url
      map = this._mapCache[mapUrl]
      if (!map) {
        this.hls.emit(EVENT.LOAD_START, { url: mapUrl })
        toLoad[1] = segLoader.load(mapUrl).then(r => {
          if (r) {
            const l = Object.keys(this._mapCache)
            if (l > 30) this._mapCache = {}
            map = this._mapCache[mapUrl] = r.data
            this._emitOnLoaded(r, mapUrl)
          }
        })
      }
      const keyUrl = seg.initSegment.key?.url
      if (keyUrl) {
        mapKeyIv = seg.initSegment.key.iv
        mapKey = this._keyCache[keyUrl]
        if (!mapKey) {
          this.hls.emit(EVENT.LOAD_START, { url: keyUrl })
          toLoad[2] = this._keyLoader.load(keyUrl).then(r => {
            if (r) {
              mapKey = this._keyCache[keyUrl] = r.data
              this._emitOnLoaded(r, keyUrl)
            }
          })
        }
      }
    }

    const keyUrl = seg.key?.url
    if (keyUrl && seg.key.isSegmentEncrypted()) {
      keyIv = seg.key.iv
      key = this._keyCache[keyUrl]
      if (!key) {
        this.hls.emit(EVENT.LOAD_START, { url: keyUrl })
        toLoad[3] = this._keyLoader.load(keyUrl).then(r => {
          if (r) {
            key = this._keyCache[keyUrl] = r.data
            this._emitOnLoaded(r, keyUrl)
          }
        })
      }
    }

    const [s] = await Promise.all(toLoad)
    if (!s) return
    const data = s.data
    this._emitOnLoaded(s, seg.url)

    return {
      data,
      map,
      key,
      mapKey,
      keyIv,
      mapKeyIv
    }
  }
@param {NetLoader} segLoader
@param {MediaSegment} seg
@param {boolean} loadInit