1 前言
前面系列文章,对IJKPLAYER源码所涉及到的各个技术点、模块、关键技术及其实现原理,做了较为详细的梳理。但窃以为那只是微观层面的梳理,还不够完整不够透彻,本文拟尝试从宏观框架架构的视角加以补充。
算是抛砖引玉。在此列出对IJKPLAYER源码分析的系列文章:
IJKPLAYER源码分析-Android端显示-优快云博客
IJKPLAYER源码分析-OpenGL ES渲染-优快云博客
IJKPLAYER源码分析-AudioQueue播放-优快云博客
IJKPLAYER源码分析-OpenSL ES播放-优快云博客
IJKPLAYER源码分析-AudioTrack播放-优快云博客
IJKPLAYER源码分析-videotoolbox硬解-优快云博客
IJKPLAYER源码分析-mediacodec硬解_ijkplayer硬解-优快云博客
IJKPLAYER源码分析-重要字段_packet-buffering-优快云博客
IJKPLAYER源码分析-音视频同步_ijkplayer 音视频同步-优快云博客
IJKPLAYER源码分析-常用API_sdl_profilerreset-优快云博客
IJKPLAYER源码分析-主要队列_ijkplayer packetqueue-优快云博客
IJKPLAYER源码分析-软解主结构_androi中ijkplayer源码分析-优快云博客
2 架构图
IJKPLAYER框架图
阐述如下:
- 网络层:拉流、解协议、解封装,使用的是FFmpeg库,因此FFmpeg所能支持的协议,IJKPLAYER均支持,具体执行是在read_thread线程,软解及Android和iOS硬解平台无关;
- 解码层:分为音频和视频解码,其中音频解码及视频软解,Android和iOS统一逻辑,均使用FFmpeg软解,而视频硬解则因Android和iOS系统而已,Android使用Android SDK层mediacodec解码能力,iOS则使用videotoolbox解码;
- 渲染层:也分为音频和视频渲染显示,音频Android支持AudioTrack和OpenSL ES播放、iOS支持AudioQueue播放(AudioUnit亦有实现),而视频Android系统则分为ANativeWindow和OpenGL ES + EGL,iOS则是OpenGL ES + EAGL;
3 线程模型
具体到IJKPLAYER程序实现上来看,首先来看看各个线程及其通信方式:
- 网络线程与音频解码线程audio_thread、视频解码线程以及字幕解码线程subtitle_thread,用PacketQueued队列通信,可通过选项限制队列大小;
- 音频解码线程audio_thread、视频解码线程以及字幕解码线程subtitle_thread与音视频各自render线程用FrameQueue队列通信,由于是像素或pcm数据,因此