ijkplayer 消息循环处理过程分析
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 消息循环处理过程分析相关推荐
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- 异步IO(协程,消息循环队列)
同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...
- 应用程序进程(三):创建消息循环
1.在ActivityThread的main方法中开启主线程的消息循环 在其它线程中创建Looper可使用 Looper.prepare()方法 //ActivityThread#main publi ...
- android 结束if循环_Android Handler 消息循环机制
前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...
- 模态对话框和非模态对话框的消息循环
1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...
- android 消息循环机制--looper handler
Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...
- TApplication与主消息循环
Windows应用程序的每一个窗口都有一个大的消息循环以及一个窗口函数(WndProc)用以分发和处理消息.VCL作为一个Framework,当然会将这些东西隐藏起来,而重新提供一种易用的.易理解的虚 ...
- 2.创建适合游戏的窗口和消息循环
2.创建适合游戏的窗口和消息循环 本章前言: 创建游戏窗口和处理消息循环是很重要的事情,我尝试过几种不同的窗口处理方式,这次打算使用WS_POPUP样式的窗口(无边框).上一次的框架代码把创建窗口和消 ...
最新文章
- 11CSS的三大特性
- ASP.NET MVC实现一个用户只能登录一次 单用户登录
- 2018 年都过去了,你还没有掌握用户运营的核心技巧?
- 阿里云服务器新手安装nginx
- 别再拿div+css误导人了
- COM 组件实现事件、通知
- 天正cad计算机快捷键,天正CAD快捷键大全
- c 是高级程序设计语言吗,下列各类计算机程序语言中,不属于高级程序设计语言的是()。A.Visual BasicB.FORTRAN语言C.Pasca...
- 从全班同学的成绩中找出最高成绩(遍历一位数组)
- 费曼:任何伟大的科学成就,都源于思想自由
- 类选择器和ID选择器
- centos 7.x 安装python 3.6 并创建虚拟环境
- 如何批量删除PDF文件中的页面
- java实现加减乘除_用Java编写实现加减乘除,界面如下
- 近期微信登录10005报错,解决办法
- Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址
- 从传统企业到字节、美团、京东,再到拿下华为Offer,程序员的逆袭之路。
- 上海Java培训机构排名榜单已出炉,实力学员推荐不看后悔
- [数据挖掘理论与案例] 大数据的4个V
- 【视觉定位UV】日志分析之Mark点详解