当前位置: 首页 > news >正文

无锡cms建站angular2.0网站制作

无锡cms建站,angular2.0网站制作,成都知名网站建设公司,公司网页设计作品系列文章目录 ExoPlayer架构详解与源码分析#xff08;1#xff09;——前言 ExoPlayer架构详解与源码分析#xff08;2#xff09;——Player ExoPlayer架构详解与源码分析#xff08;3#xff09;——Timeline ExoPlayer架构详解与源码分析#xff08;4#xff09;—…系列文章目录 ExoPlayer架构详解与源码分析1——前言 ExoPlayer架构详解与源码分析2——Player ExoPlayer架构详解与源码分析3——Timeline ExoPlayer架构详解与源码分析4——整体架构 ExoPlayer架构详解与源码分析5——MediaSource ExoPlayer架构详解与源码分析6——MediaPeriod ExoPlayer架构详解与源码分析7——SampleQueue 文章目录 系列文章目录前言MediaPeriodMediaPeriod的实现ProgressiveMediaPeriod总结 前言 上篇看完了MediaSource发现其中正在发挥作用的是其中的MediaPeriod如果MediaSource是燃料系统的外壳那么MediaPeriod就是其外壳下的核心媒体数据的的加载获取甚至是解析主要就靠它了。 MediaPeriod 先看下整体结构 MediaPeriod主要用于加载于Timeline中的一个Period对于的媒体数据。换句话说Timeline中有多少个Period就会对于多少个MediaPeriod。 MediaPeriod的所有方法都在播放器内部线程调用。MediaPeriod是在MediaSource.createPeriod创建的MediaSource中媒体数据的加载读取解复用最终提供数据给Renderer等都通过它来实现。MediaPeriod 中每个轨道对应一个SampleStreamMediaPeriod 在同一时间可能只能为一个SampleStream提供数据但是当前的SampleStream 可以切换因为MediaPeriod在读取数据时是单线程的获取到数据后会同步解析数据通过TrackId 将其关联到不同的轨道的SampleStream 中这个后面具体会讲到。 看下几个重要的方法定义 prepare异步准备当前的MediaPeriod因为是异步的方法入参提供了一个Callback在prepared后通知调用者在通知调用者前搜先会调用MediaSource的onSourceInfoRefreshed通知MediaSource更新Timeline然后完成解轨道数据的解析提供给getTrackGroups方法目的是提前准备好Timeline如果prepare失败就会调用MediaPeriod的maybeThrowPrepareError方法 maybeThrowPrepareError功能如上这个方法只会在prepare完成前调用 getTrackGroups获取解析出的轨道数据因为解析轨道是prepare时完成的所以这个方法只能在prepared之后调用。 selectTracks执行轨道选择这是一个重要的方法就是在这个方法中将轨道数据提供给上层使用者的确切的说是Renderer同时Renderer也通过mayRetainStreamFlags 告诉MediaPeriod使用保留当前的SampleStream。MediaPeriod如果创建了新的流或者更新了SampleStream也会通过streamResetFlagstrue来告诉Renderer需要重置当前的Renderer了。另外每次调用都应该更新TrackSelections。同样这个方法肯定也只能在prepared之后调用。 long selectTracks(NullableType ExoTrackSelection[] selections,//TrackSelector提供的轨道选择boolean[] mayRetainStreamFlags,//需要保留的流NullableType SampleStream[] streams,//提供的数据流boolean[] streamResetFlags,//需要替换的流long positionUs);//当前的播放位置如果当前的period还没有播放这个值就是起始播放位置seekToUs Seek到指定位置。仅当至少选择一个轨道时才会调用此方法。 continueLoading 当需要继续加载数据时调用MediaPeriod在prepareing或者prepared后都可以调用这个方法。 reevaluateBuffer 释放SampleStream的相关缓存同样这个方法肯定也只能在prepared之后调用。 getStreamKeys 当MediaPeriod由多个播放源时如HLS这个方法返回一个多个源关于选中轨道的KeyList MediaPeriod接口定义了数据解析的大致过程 prepare准备数据源完成后selectTracks向外提供出SampleStreamcontinueLoading 继续加载数据填充SampleStream将使用完的数据通过reevaluateBuffer释放 MediaPeriod的实现 可以看到基本每一种ExoPlayer支持的媒体都实现了一个MediaPeriodProgressiveMediaPeriod相对比较基础和典型后面也将重点解析它剩余其他几种类型的可以先做了解后面有时间再扩充。 ProgressiveMediaPeriod ProgressiveMediaSource的MediaPeriod实现主要用于渐进式媒体文件的加载如本地或远程的单个视频文件 先看下ProgressiveMediaPeriod整体结构 ProgressiveMediaPeriod主要分2部分 数据存取 管理缓存获取的数据主要交由SampleQueue来负责需要提供高效的缓存读写能力保证数据的持续性。数据加载解析 加载主要由DataSource负责主要工作是获取媒体数据供解析器读取解析器主要指的是Extractor主要负责将获取的数据解析到不同的SampleQueue中。 上图中并没有MediaPeriod提到的SampleStream其实ProgressiveMediaPeriod内部类中实现了SampleStream 通过内部类将 对SampleStream 操作通过trackid关联转发给SampleQueue来实现所以上图中的SampleQueue其实就是相当于SampleStream。 private final class SampleStreamImpl implements SampleStream {private final int track;public SampleStreamImpl(int track) {this.track track;}Overridepublic boolean isReady() {return ProgressiveMediaPeriod.this.isReady(track);}Overridepublic void maybeThrowError() throws IOException {ProgressiveMediaPeriod.this.maybeThrowError(track);}Overridepublic int readData(FormatHolder formatHolder, DecoderInputBuffer buffer, ReadFlags int readFlags) {return ProgressiveMediaPeriod.this.readData(track, formatHolder, buffer, readFlags);}Overridepublic int skipData(long positionUs) {return ProgressiveMediaPeriod.this.skipData(track, positionUs);}}/* package */ int readData(int sampleQueueIndex,FormatHolder formatHolder,DecoderInputBuffer buffer,ReadFlags int readFlags) {if (suppressRead()) {return C.RESULT_NOTHING_READ;}maybeNotifyDownstreamFormat(sampleQueueIndex);int result //sampleQueueIndex查询对应的sampleQueues读取数据sampleQueues[sampleQueueIndex].read(formatHolder, buffer, readFlags, loadingFinished);if (result C.RESULT_NOTHING_READ) {maybeStartDeferredRetry(sampleQueueIndex);}return result;}Extractor和DataSource那一块还没扩展开目前就已经很复杂了DrmSessionManager和LoadErrorHandlingPolicy不是主线任务就跳过了重点关注Loder、SampleQueue、DataSource、Extractor。 总结 MediaPeriod接口只是定义了标准的执行逻辑具体如何实现其中定义的每个方法其实每种MediaPeriod实现都会有很大的差异因为媒体结构本身就千变万化。ProgressiveMediaPeriod实现了其中一种相对基础的媒体类型但是结构也很复杂预计下面分多篇将ProgressiveMediaPeriod的SampleQueue、Loder、DataSource、Extractor分析一遍下篇先从SampleQueue说起。 版权声明 © 本文为CSDN作者山雨楼原创文章 转载请注明出处 原创不易觉得有用的话收藏转发点赞支持
http://www.sadfv.cn/news/389468/

相关文章:

  • 石家庄网站建设全包一个公司可以做几个网站
  • 企业网站建设费用大约多少钱中国it企业排行榜
  • 网站建设自查报告兴安盟seo
  • 企业网站建设cms站继电器做网站
  • 回收做哪个网站好些厦门博客网站制作
  • 网站做广告如何做帐陵水网站建设哪家专业
  • 网站建设公司专业松江做网站价格
  • 网站稳定性不好的原因商城类型的网站怎么做
  • 怎么安装百度河北seo网站开发
  • python做网站 jsp网站关于asp sql网站开发的书籍
  • 做网站多少钱 优帮云湖北网络建设公司网站
  • 网站建设最简单的教程重庆装修公司口碑排名
  • 烟台网站建设方案报价网站打开空白 重启iis就好了
  • 吉祥物设计网站做网站延期交付了
  • 建设一个网站大概多少钱住房和城乡建设部网站质保金
  • 画家网站建设网站描述怎么写比较好
  • 网站如何设置广告wordpress视频全屏
  • 做一个网站的费用构成wordpress网站不稳定
  • win7怎么做网站映射微信导入wordpress
  • 建个人网站赚钱多吗Wordpress变装
  • 艾纳网站建设虚拟机做网站
  • 地推网站信息怎么做安徽一方建设招标网站
  • 一个公司可以备案两个网站武进附近做网站的公司有哪些
  • 网站开发的报告书wordpress怎么搬运
  • 网站广告源码做一家电商网站需要多少钱
  • 贝壳找房官网 二手房seo推广顾问
  • 中国建设银行网站怎么交学费国家企业信息信用公信系统
  • 山东省建设厅网站特种作业asp.net 网站开发架构
  • 淄博网站建设同圈科技登封网站建设公司
  • 做网站的流程百科阿里巴巴国际站用户规模