sony开源播放器的架构设计

1.架构设计为多线程,每个线程中采用EventHandler来维系状态交替,线程之间通过将Handler传入其他的线程中关键函数的构造函数来完成线程间的通信。
具体的例子如:MediaPlayer中创建了自己的EventHandler,并设置了MediaPlayer的各种状态和接收到不同状态通知时应该处理的事情。然后将该EventHandler传入到Player这个类的构造函数中,同时Player自身也创建了自己的HandlerThread,用于维系Player thread的状态,player自身状态在发生变化的时候将信息通过MediaPlayer线程传递过来的Handler来将信息传递给MediaPlayer线程。同时Player自身又将自己的Handler传递给了DashSource中的构造函数,以便能够监测DashSource中的各种变化。接下来DashSource又采用相同的方式来建立与DashSession之间的通信机制。
sony开源播放器的架构设计_第1张图片
架构设计

2. 各个线程的功能设计
MediaPlayerThread:与调用播放器的相关对象进行通信,负责播放器的初始化,PlayerThread输出包括视频的各种信息,当前播放器的状态。调用播放器的相关对象传入视频的地址,当前陀螺仪的方向,渲染的SurfaceTexture对象。
PlayerThread:负责将与视频下载缓冲模块进行通信、音视频解码渲染模块进行通信。
DashSourceThread:负责音视频数据的下载和缓冲以及将相应数据传递给音视频线程。对于解析,具体的又包括MPD文件的下载和解析,初始化当前方向的音视频数据下载调度器,根据当前方向的变化来新建新方向的音视频方向的下载调度器和进度设置,音视频数据的下载调度,如何选取当前方向的最近方向的数据进行下载。
数据的缓冲模块则需要负责将当前对应方向的音视频数据塞入相应的音视频线程中,以及如何选取跟当前最近方向的流的数据。
VideoThread:负责对视频数据进行解码和视频帧的渲染。具体包括解码器的初始化和视频数据的拉取、解码、丢帧逻辑和渲染时机控制。
AudioThread:负责音频数据的解码和播放。
3.VideoThread视频的解码逻辑
实际上在VideoThread中包含了两个线程,一个叫做VideoThread是负责解码调度的,另一个是Video-Render负责视频渲染的。
VideoThread初始化的时候需要一个MediaFormat的信息用来初始化codec,MediaFormat的信息是从init头中解析出来的。
如果该手机的Codec支持视频的清晰度的自适应切换,那么可以直接在不同清晰度之间切换,否则当MediaFormat发生变化时,需要重新初始化Codec模块。
MediaCodec中包含有两个buffer,一个是解码前的数据buffer,一个是解码后的数据buffer。整个的解码流程如下:
解码线程先查看MediaCodec中的buffer是否还有位置,如果有,解码器获取到一帧最新的数据,然后放到inputbuffer中。
同时codec会将数据解码并且将解码后的数据放入outputbuffer中。最后client再将数据消费掉。
4.AudioThread音频的解码逻辑
音频线程的解码逻辑类似视频解码线程

你可能感兴趣的:(音视频)