iOS ijkplayer 学习

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方法,该方法执行了以下操作:

  1. 创建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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值