阿里播放器技术架构图:
播放起的整体架构包含播放的整体功能,缓存文件和后处理功能扩展,其他业务支持功能等
底层基础支持需要:
音视频基础库(ffmpeg)
网络库(libcurl)
其他支持(openssl,xml,drm,等)
按功能的模块划分,形成串行模块结构,每个模块负责自己单独的数据处理任务。
dataSource : 数据下载
demuxer: 音视频数据解析
deocer: 音视频数据解码
render: 数据渲染
中间层对底层进行统一封装处理
业务层对扩展功能进行添加喝管理,可以自由进行扩展。
API在各个平台进行接口提供和功能适配。
1)播放内核代码结构(安卓):
各个功能类说明:
JAVA层:
CicadaPlayer: 对外提供的功能接口类
NativePlayerBase: 封装native函数和相关事件回调函数
CicadaExternalPlayer: 封装了机遇安卓系统播放库的播放器函数API
其他: 其他需要在JAVA层实现的功能
Native层:
NativeBase:承接 上层的native函数的实现和 JAVA-C之间的交互
MediaPlayer: 底层的播放器控制类,作为整体底层功能和上层提供的编排控制层
JavaExternalPlayer: 用JNI方法控制JAVA层CicadaExternalPlayer功能实现的类
SuperMediaPlayer: 最基础的实现底层播放器各种控制的类,(实现主线程的控制)
SMPAVDeviceManager: 实现解码器和设备渲染模块的控制
Decoder/Render: 解码器,渲染控制
Buffercontroller: 拥有解码帧的队列,并对此进行控制
IDataSource: 读取数据模块的模版,主要控制各种类型的数据加载
Demuxer_Service: 解复用的封装类
IDemuxer:解复用模块模版
SMPMessageControllerlistener: 消息队列里各种消息的处理
2)播放内核线程结构:
线程简要说明:(仅是一种情况,也有其他的模块的其他线程情况)
avFormatDemuxer::readLoop() (读取线程!) (HLSStream::read_thread())
SuperMediaPlayer::mainService() (主线程!)
ActiveDecoder::decode_func() (解码线程 !)
timedVSync::timedThread() (同步 视频渲染)
filterAudioRender::renderLoop() (音频渲染!)
MainService 主线程执行流程:
check time :设置时间戳
doReadPacket :读取数据帧并放入帧队列中
从 Demuxer_Service 读取 packet 数据
将帧数据放到 Buffercontroller 中的 PacketsQueue 中
doDecode: 获取解码数据,将帧数据送入解码器中
Video: FillVideoFrame (getFrame) - > DecodeVideoPacket (sendPacket)
Audio: DecodeAudio (getFrame -> sendPacket)
SetUpAVPath: 设置解码器,设置渲染模块
SetUpAudioPath: 建立 Audio的解码器和渲染器
SetUpVideoPath: 同上 video
doRender
check other