iOS ijkplayer 源码学习
ijkplayer 在iOS 中的调用主要是通过其IJKFFMoviePlayerController 控制器来完成,其中设置SDLView等界面适配可见具体的参数设定。本文章主要是用于将自己所学习到的知识进行一个总结,加深自身的印象。ijkplayer 默认使用的是软解码操作,也就是用ffmpeg 调用GPU进行解码,如果需要使用系统自带的硬解码操作,则需要进行单独的配置。
一、初始化流程
- (id)initWithContentURL:(NSURL *)aUrl withOptions:(IJKFFOptions *)options 是上层调用ijkplayer 的一个入口,我们从这里开始解析。
实现音视频的播放,主要通过的是ijkMediaPlayer类进行,ijkMediaPlayer是一个结构体
struct IjkMediaPlayer {
// 使用ijkmp_create 创建player 后的一个计时器,创建一个player。该数值+1
volatile int ref_count;
// 线程锁,用于保护编解码线程
pthread_mutex_t mutex;
// ffmpeg 底层的播放类
FFPlayer *ffplayer;
// msg_loop是用于ijkplayer底层往app调用者通知各种事件的一个函数。以便于业务层根据事件做各种调整
int (*msg_loop)(void*);
// 记录创建消息循环ijkmp_msg_loop 函数的线程
SDL_Thread *msg_thread;
/*从SDL_CreateThreadEx(&mp->_msg_thread,ijkmp_msg_loop, mp,"ff_msg_loop")可以看到,其实上面的msg_thread是指向填充数据过后的_msg_thread实体。SDL_Thread里面的数据来源于SDL_CreateThreadEx函数传入。*/
SDL_Thread _msg_thread;
// 播放状态ijkmp_change_state_l 函数专门用来改变mp_state 状态值
int mp_state;
// 存储上层传入的url
char *data_source;
void *weak_thiz;
int restart;
int restart_from_beginning;
int seek_req;
// 记录ijkmp_seek_to 要拖动到第几毫秒值
long seek_msec;
};
上述OC 方法主要调用了ijkplayer_ios中的ijkmp_ios_create方法,该方法执行了以下操作:
- 创建ijkMediaPlayer对象
// 创建对象
IjkMediaPlayer *mp = (IjkMediaPlayer *) mallocz(sizeof(IjkMediaPlayer));
......
// 创建ffplayer 对象
mp->ffplayer = ffp_create();
// 指定消息处理函数
mp->msg_loop = msg_loop;
// 指定了解码方式
mp->ffplayer->pipeline = ffpipeline_create_from_ios(mp-&g

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



