当前位置:   article > 正文

Exoplayer(6)-Exoplayer数据源打开过程_exoplayer updateperiods

exoplayer updateperiods

数据源打开流程

ExoPlayerImplInternal.updatePeriods() ->
ExoPlayerImplInternal.maybeUpdateLoadingPeriod() ->
MediaPeriodQueue.enqueueNextMediaPeriodHolder()->
MediaPeriodHolder() -> MediaPeriodHolder.createMediaPeriod() ->
MediaSourceList.createPeriod()->
MediaSourceHolder.MaskingMediaSource.createPeriod() ->
MaskingMediaPeriod.prepare() ->
ProgressiveMediaPeriod.prepare() ->ProgressiveMediaPeriod.startLoading() ->
Loader.startLoading() -> ProgressiveMediaPeriod.ExtractingLoadable() ->
ProgressiveMediaPeriod.ExtractingLoadable.load() →

ExoPlayerImplInternal

private void updatePeriods() throws ExoPlaybackException, IOException {
    //创建媒体MediaPeriod 加载数据流
    maybeUpdateLoadingPeriod();
}
 
private void maybeUpdateLoadingPeriod() throws ExoPlaybackException {
    if (queue.shouldLoadNextMediaPeriod()) {
      MediaPeriodInfo info = queue.getNextMediaPeriodInfo(rendererPositionUs, playbackInfo);
      if (info != null) {
        //MediaPeriodQueue 中获取 MediaPeriodHolder
        MediaPeriodHolder mediaPeriodHolder =
            queue.enqueueNextMediaPeriodHolder(
                rendererCapabilities,
                trackSelector,
                loadControl.getAllocator(),
                mediaSourceList,            //从mediaSourceList 获取MediaSourceHolder构造MediaPeriod
                info,
                emptyTrackSelectorResult);
        //调用MediaPeriod 准备数据
        mediaPeriodHolder.mediaPeriod.prepare(this, info.startPositionUs);
      }
    }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

MediaPeriodQueue

public MediaPeriodHolder enqueueNextMediaPeriodHolder(
      RendererCapabilities[] rendererCapabilities,
      TrackSelector trackSelector,
      Allocator allocator,
      MediaSourceList mediaSourceList,
      MediaPeriodInfo info,
      TrackSelectorResult emptyTrackSelectorResult) {
    //构造新的MediaPeriodHolder, 加载数据
    MediaPeriodHolder newPeriodHolder =
        new MediaPeriodHolder(
            rendererCapabilities,
            rendererPositionOffsetUs,
            trackSelector,
            allocator,
            mediaSourceList,
            info,
            emptyTrackSelectorResult);
    if (loading != null) {
      //如果loading MediaPeriodHolder 不为空, newPeriodHolder 设置为下一个预加载, Exoplayer支持多播放列表预加载
      loading.setNext(newPeriodHolder);
    } else {
      //首次加载, playing 和reading 均设置为 newPeriodHolder
      playing = newPeriodHolder;
      reading = newPeriodHolder;
    }
    
    loading = newPeriodHolder;
    length++;   //记录加载中MediaPeriodHolder 的长度
     
    return newPeriodHolder;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

MediaPeriodHolder

public MediaPeriodHolder(
      RendererCapabilities[] rendererCapabilities,
      long rendererPositionOffsetUs,
      TrackSelector trackSelector,
      Allocator allocator,
      MediaSourceList mediaSourceList,
      MediaPeriodInfo info,
      TrackSelectorResult emptyTrackSelectorResult) {
    //创建MediaPeriod
    mediaPeriod = createMediaPeriod(info.id, mediaSourceList, allocator, info.startPositionUs, info.endPositionUs);
  }
 
private static MediaPeriod createMediaPeriod(
      MediaPeriodId id,
      MediaSourceList mediaSourceList,
      Allocator allocator,
      long startPositionUs,
      long endPositionUs) {
    //通过MediaSourceList 创建 MediaPeriod
    MediaPeriod mediaPeriod = mediaSourceList.createPeriod(id, allocator, startPositionUs);
    return mediaPeriod;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

MediaSourceList

public MediaPeriod createPeriod(MediaSource.MediaPeriodId id, Allocator allocator, long startPositionUs) {
    //获取MediaSourceHolder
    MediaSourceHolder holder = Assertions.checkNotNull(mediaSourceByUid.get(mediaSourceHolderUid));
    enableMediaSource(holder);
    //通过MediaSource构造 MediaPeriod
    MediaPeriod mediaPeriod = holder.mediaSource.createPeriod(childMediaPeriodId, allocator, startPositionUs);
    mediaSourceByMediaPeriod.put(mediaPeriod, holder);
    disableUnusedMediaSources();
    return mediaPeriod;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

ProgressiveMediaPeriod

public void prepare(Callback callback, long positionUs) {
    //开始打开加载数据
    startLoading();
}
 
private void startLoading() {
    //构造ExtractingLoadable 加载对象
    ExtractingLoadable loadable =
        new ExtractingLoadable(
            uri, dataSource, progressiveMediaExtractor, /* extractorOutput= */ this, loadCondition);
    if (prepared) {
    // 开启加载线程
    long elapsedRealtimeMs = loader.startLoading(loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType));
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

ProgressiveMediaPeriod.ExtractingLoadable

public void load() throws IOException {
      int result = Extractor.RESULT_CONTINUE;
      while (result == Extractor.RESULT_CONTINUE && !loadCanceled) {
        try {
          //构建dataSpec
          dataSpec = buildDataSpec(position);
          //打开数据流  
          long length = dataSource.open(dataSpec);
          //初始化Extractor
          progressiveMediaExtractor.init(
              extractorDataSource,
              uri,
              dataSource.getResponseHeaders(),
              position,
              length,
              extractorOutput);
 
          //循环读取数据
          while (result == Extractor.RESULT_CONTINUE && !loadCanceled) {
            //将读取多数据塞给Extractor
            result = progressiveMediaExtractor.read(positionHolder);
          }
        }
      }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/295784
推荐阅读
相关标签
  

闽ICP备14008679号