ijkplayer 消息循环处理过程分析

  • 简介
  • 一、消息队列初始化
    • 1、 initWithContentURLString函数
    • 2、 ijkmp_ios_create函数
    • 3、 ijkmp_create函数
  • 二、消息队列的消息循环处理函数启动
    • 1、prepareToPlay函数
    • 2、ijkmp_prepare_async函数
    • 3、ijkmp_prepare_async_l函数
    • 4、ijkmp_msg_loop函数
  • 三、消息循环处理
    • 1、 media_player_msg_loop消息循环函数
    • 2、 ijkmp_get_msg函数
    • 3、 postEvent函数

简介

ijkplayer是一个基于FFPlay二次开发的
轻量级Android/iOS视频播放器,实现了跨平台的功能

下面以ios平台调用的过程来分析ijkplayer的消息队列事件处理流程
基于版本k0.7.6
源码地址:https://gitee.com/mirrors/ijkplayer

底层播放控制的C代码 和 上层的ios平台上操作控制的OC代码通信都是通过这个消息队列来交互的。所以搞清楚这个消息队列的处理流程尤为重要。


消息队列的事件定义在ijkplayer\ijkmedia\ijkplayer\ff_ffmsg.h
消息队列的操作函数在ijkplayer\ijkmedia\ijkplayer\ff_ffmsg_queue.h
(与ffplay的PacketQueue类似,是由一个链表变化而成的一个队列)

一、消息队列初始化

1、 initWithContentURLString函数

在ijkplayer\ios\IJKMediaPlayer\IJKMediaPlayer\IJKFFMoviePlayerController.m
的中调用ijkmp_ios_create(media_player_msg_loop)函数初始化IjkMediaPlayer结构时传入了一个消息循环函数指针

2、 ijkmp_ios_create函数

在ijkplayer\ios\IJKMediaPlayer\IJKMediaPlayer\ijkmedia\ijkplayer\ios\ijkplayer_ios.m
这个文件就是ios平台下对ijkplaer.c的一个封装
再调用ijkmp_create(msg_loop)

3、 ijkmp_create函数

在ijkplayer\ijkmedia\ijkplayer\ijkplayer.c这个文件中,
这个文件这一层就是底层播放控制的C代码 和 上层的ios平台上操作控制的OC代码的中间层就是消息循环函数运行的这一层

创建IjkMediaPlayer结构对象后将msg_loop消息循环函数指针赋值保存到ijkMediaPlayer的msg_loop成员变量中。

msg_loop:保存oc层的消息循环函数
msg_thread:运行msg_loop这个消息循环函数的线程
ffplayer:底层播放控制结构,内部的msg_queue就是这个消息队列

到这里事件处理的消息队列初始化就完成了,但消息循环函数还没跑起来的。

二、消息队列的消息循环处理函数启动

1、prepareToPlay函数

在ijkplayer\ios\IJKMediaPlayer\IJKMediaPlayer\IJKFFMoviePlayerController.m,
调用ijkmp_prepare_async(_mediaPlayer);
准备播放操作

2、ijkmp_prepare_async函数

在ijkplayer\ijkmedia\ijkplayer\ijkplayer.c
这个是进入加锁操作的,再调用ijkmp_prepare_async_l(mp);
才是真正操作

3、ijkmp_prepare_async_l函数

在ijkplayer\ijkmedia\ijkplayer\ijkplayer.c
函数中调用
mp->msg_thread = SDL_CreateThreadEx(&mp->_msg_thread, ijkmp_msg_loop, mp, “ff_msg_loop”);
进行创建消息循环处理线程

4、ijkmp_msg_loop函数

在ijkplayer\ijkmedia\ijkplayer\ijkplayer.c
内部就是调用mp->msg_loop(arg);
此时消息循环处理函数就跑起来了。

三、消息循环处理

1、 media_player_msg_loop消息循环函数

在ijkplayer\ios\IJKMediaPlayer\IJKMediaPlayer\IJKFFMoviePlayerController.m
注意两个函数调用:
ijkmp_get_msg(mp, &msg->_msg, 1) : 是播放底层需要处理的消息
[ffpController performSelectorOnMainThread:@selector(postEvent:) withObject:msg waitUntilDone:NO]:是oc层需要处理的消息
根据这个顺序是ijkmp_get_msg从获取消息队列获取出来消息,如果是播放底层需要处理的消息就处理。返回后,再将这个消息传入oc层的postEvent处理。

2、 ijkmp_get_msg函数

在ijkplayer\ijkmedia\ijkplayer\ijkplayer.c文件中
部分截图

3、 postEvent函数

在ijkplayer\ios\IJKMediaPlayer\IJKMediaPlayer\IJKFFMoviePlayerController.m文件中
部分截图

ijkplayer 消息循环处理过程分析相关推荐

  1. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  2. 异步IO(协程,消息循环队列)

    同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...

  3. 应用程序进程(三):创建消息循环

    1.在ActivityThread的main方法中开启主线程的消息循环 在其它线程中创建Looper可使用 Looper.prepare()方法 //ActivityThread#main publi ...

  4. android 结束if循环_Android Handler 消息循环机制

    前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...

  5. 模态对话框和非模态对话框的消息循环

    1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...

  6. android 消息循环机制--looper handler

    Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...

  7. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

  8. TApplication与主消息循环

    Windows应用程序的每一个窗口都有一个大的消息循环以及一个窗口函数(WndProc)用以分发和处理消息.VCL作为一个Framework,当然会将这些东西隐藏起来,而重新提供一种易用的.易理解的虚 ...

  9. 2.创建适合游戏的窗口和消息循环

    2.创建适合游戏的窗口和消息循环 本章前言: 创建游戏窗口和处理消息循环是很重要的事情,我尝试过几种不同的窗口处理方式,这次打算使用WS_POPUP样式的窗口(无边框).上一次的框架代码把创建窗口和消 ...

最新文章

  1. 11CSS的三大特性
  2. ASP.NET MVC实现一个用户只能登录一次 单用户登录
  3. 2018 年都过去了,你还没有掌握用户运营的核心技巧?
  4. 阿里云服务器新手安装nginx
  5. 别再拿div+css误导人了
  6. COM 组件实现事件、通知
  7. 天正cad计算机快捷键,天正CAD快捷键大全
  8. c 是高级程序设计语言吗,下列各类计算机程序语言中,不属于高级程序设计语言的是()。A.Visual BasicB.FORTRAN语言C.Pasca...
  9. 从全班同学的成绩中找出最高成绩(遍历一位数组)
  10. 费曼:任何伟大的科学成就,都源于思想自由
  11. 类选择器和ID选择器
  12. centos 7.x 安装python 3.6 并创建虚拟环境
  13. 如何批量删除PDF文件中的页面
  14. java实现加减乘除_用Java编写实现加减乘除,界面如下
  15. 近期微信登录10005报错,解决办法
  16. Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址
  17. 从传统企业到字节、美团、京东,再到拿下华为Offer,程序员的逆袭之路。
  18. 上海Java培训机构排名榜单已出炉,实力学员推荐不看后悔
  19. [数据挖掘理论与案例] 大数据的4个V
  20. 【视觉定位UV】日志分析之Mark点详解

热门文章

  1. js、react对象名和对象属性赋值
  2. vue 新版本 webpack 代理 跨域设置
  3. 点击图片放大至原始图片大小
  4. 送福利:ROKID 语音开发板免费送,开启你的物联网之旅
  5. BZOJ2809 dispatching 【可并堆】
  6. yaml,json,ini这三种格式用来做配置文件优缺点
  7. 什么情况使用 weak 关键字,相比 assign 有什么不同?
  8. 卷积神经网络(CNN)与特殊的卷积
  9. 如何在自己的代码中实现分享视频文件或者是图片文件到微信 QQ微博 新浪微博等!!!...
  10. c#语言基础编程-转义符