赞
踩
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() →
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); } } }
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; }
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; }
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;
}
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));
}
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); } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。