Mediacodec学习(EXOPlayer分析)

Mediacodec学习第二篇 -- EXOPlayer

分析的主要内容

#  网络视频流解析
Mediacodec学习(EXOPlayer分析)_第1张图片
根据数据解析成对应的封装类型

还记得这个MediaSource吗?
buildMediaSource则根据网络数据来解析成对应数据封装
比如:HLS,DASH等


Mediacodec学习(EXOPlayer分析)_第2张图片
封装格式

Mediacodec学习(EXOPlayer分析)_第3张图片
扩展型

如果要支持RTSP播放,首先需要扩展一个基于RTSP的DataSource来完成RTSP的交互
通过http方式和本地播放方式在EXOPlayer上成功播放了MPEG4 H264 TS的视频,也就是说符合IPTV编码规范,为兼容IPTV RTSP扩展需要处理的是信令交互过程。


Mediacodec学习(EXOPlayer分析)_第4张图片
Paste_Image.png

那需要先分析ExoPlayer是如何把通过网络缓冲的数据写入render中的。
在ExtractorMediaPeriod的load处理中dataSource.open完成了数据请求交互


Mediacodec学习(EXOPlayer分析)_第5张图片
ExtractorMediaPeriod::load
Mediacodec学习(EXOPlayer分析)_第6张图片
TsExtractor::read
Mediacodec学习(EXOPlayer分析)_第7张图片
DefaultExtractorInput::read
Mediacodec学习(EXOPlayer分析)_第8张图片
DefaultExtractorInput::readFromDataSource

在ExtractorMediaPeriod的dataSource open后然后通过read方法完成buffer数据的读取。以HTTP请求为例来说明:
在open中实现inputStream实例:


Mediacodec学习(EXOPlayer分析)_第9张图片
DefaultHttpDataSource::open

在read中通过inputStream实例采集视频数据:


Mediacodec学习(EXOPlayer分析)_第10张图片
DefaultHttpDataSource::read
Mediacodec学习(EXOPlayer分析)_第11张图片
DefaultHttpDataSource::readInternal

这样把网络的视频流不断的注入给render来绘制实现硬解播放

接下来贴几张类图和序列图,都是我在实现RTSP的过程中分析画的,虽然不全也可能不对,但多少可以帮助理解分析,后期再补全。

Mediacodec学习(EXOPlayer分析)_第12张图片
DataSource家族
Mediacodec学习(EXOPlayer分析)_第13张图片
MediaSource家族
Mediacodec学习(EXOPlayer分析)_第14张图片
Player树
Mediacodec学习(EXOPlayer分析)_第15张图片
TrackSelection
Mediacodec学习(EXOPlayer分析)_第16张图片
播放时序分析

按照以上分析也完成了RTSP代码实现,写代码就是个重复劳动,服务器是用VLC扩展出来的RTSP服务器,可以参考我的另一篇文章<>,目前阶段播放中有轻微卡顿和花屏问题,原因是在接收UDP包时小概率丢几个包,正在优化。代码吗之后会在我的github中同步。

第二阶段还有优化工作需要处理,还没来得及细致的分析音视频同步,后续再分析更新。感谢关注。

你可能感兴趣的:(Mediacodec学习(EXOPlayer分析))