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文件中
部分截图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

json解析对应的value为null_徒手撸一个JSON解析器

Java大联盟致力于最高效的Java学习关注作者 | 田小波cnblogs.com/nullllun/p/8358146.html1、背景JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相对于另一种数据交换格式 XML,JSON 有着诸多优点。比如易读性更好,占用空间更少等。在 …

[一]设计模式初探

模式,顾名思义,就是做一种事情的方法归纳,就经验来说,做什么事情有个好的方法来应对都是可以事半功倍的,在软件开发中何谓好的模式? 我认为好的模式简单来说就是保证你应对需求变化的时候不用做更多的代码修改&#x…

Gentoo - ssh-agent配置

现在使用类似github这样的service&#xff0c;一般来说都会配置ssh key认证。所以使用ssh-agent来管理私钥就变的必要。在Gentoo下是这么配置的&#xff1a;- sudo emerge -avt keychain- 编辑.bashrc&#xff0c;加入keychain <private key 1 path> ... <private key…

java 方法 示例_Java ArrayDeque offerFirst()方法与示例

java 方法 示例ArrayDeque类offerFirst()方法 (ArrayDeque Class offerFirst() method) offerFirst() Method is available in java.lang package. offerFirst()方法在java.lang包中可用。 offerFirst() Method is used to add the given element at the front of this deque. …

平院Python习题

在读写文件之前&#xff0c;用于创建文件对象的函数是&#xff08; A &#xff09;。 A&#xff0e; open B&#xff0e; create C&#xff0e; file D&#xff0e;folder 解析&#xff1a; open(file, mode‘r’, buffering-1, encodingNone, errorsNone, newlineNone, close…

搭建srs服务器(rtmp)

搭建srs服务器&#xff08;rtmp&#xff09; 目录:1、下载srs源码&#xff08;从码云上&#xff09;&#xff1a;2、 切换到srs.oschina&#xff1a;3、 这里使用3.0版本&#xff1a;4、 切换到trunk&#xff1a;5、 编译&#xff1a;6、 启动&#xff1a;7、查看日志输出&…

MOSS信息管理策略定制(MOSS custom policies)

MOSS引入了信息管理策略&#xff0c;通过给文档库或列表附加一些策略可以实现一些自动化的功能&#xff0c;如自动给文档打标签&#xff0c;强制文档的审核&#xff0c;启用文档的过期&#xff0c;甚至可以在用户打印文档时插入条形码。难么&#xff0c;这么好用的功能是怎么实…

2560介绍_炒股高手收益翻10倍,只因妙用这一招2560战法,看了都不亏了

(本文由公众号越声研究(yslc927yj)整理&#xff0c;仅供参考&#xff0c;不构成操作建议。如自行操作&#xff0c;注意仓位控制和风险自负。)选股是每个刚入市的新股民需掌握的技巧&#xff0c;通过资金选股了解资金流向&#xff0c;善用工具轻松选股&#xff0c;同时多留意行业…

二进制搜索树_将排序的数组转换为二进制搜索树

二进制搜索树Problem statement: 问题陈述&#xff1a; Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个数组&#xff0c;其中元素按升序排序&#xff0c;请将其转换为高度平衡的BST。 For this problem, a he…

rtmp协议分析(三次握手)

RTMP详细分析(Message 消息&#xff0c;Chunk分块) librtmp分析&#xff08;发送数据包处理&#xff09; librtmp分析&#xff08;接收数据包处理&#xff09; RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写&#xff0c;它是由Adobe公司提出的一种应 用层的协…

OpenAPI系列: 六、OpenAPI策略分析

一、如何注册 为什么要注册&#xff1f;访问 OpenAPI必须拥有Consumer Key和Consumer Secret。 如何注册&#xff1f;要获取Consumer Key及Consumer Secret&#xff0c;需要消费方&#xff08;Consumer&#xff09;向服务提供方申请注册&#xff0c;服务提供方审核通过后会向消…

压缩、解压 解决 客户端查询大批量数据时等待时间过长的问题

在项目中查询时&#xff0c;因数据量大&#xff0c;导致网络传输很慢&#xff0c;这就需要在服务器端查询出的数据进行压缩处理&#xff0c;后传输完了在客户端进行解压处理&#xff08;此为在Silverlight中压缩与解压&#xff09;&#xff1b; 具体方法如下&#xff1a; using…

C---已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。

已知正整数n是两个不同的质数的乘积&#xff0c;试求出较大的那个质数。 思路&#xff1a;由题意可知&#xff0c;n为两个质数之积&#xff0c;也就是说只要找到一个数能够被n整除&#xff0c;这个数一定是质数&#xff01;&#xff01;&#xff01;2为最小的质数&#xff0c;…

isnumeric_Python字符串| isnumeric()方法与示例

isnumericisnumeric() is an in-built method in Python, which is used to check whether a string contains only numeric values or not. isnumeric()是Python中的内置方法&#xff0c;用于检查字符串是否仅包含数字值。 Numeric contain all decimal characters and the f…

合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数

案例分析&#xff1a;今天遇到了一个需要统计路径下目录个数的问题如果一个一个的去数会很麻烦&#xff0c;找到了一篇文章刚好提到这个&#xff0c;于是我将方法整理了一下。该方法的链接&#xff1a;Linux统计文件夹中文件个数以及目录个数_SG匚hang的博客-CSDN博客_linux统计…

关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

目录makefile写法1. 简介2. 上路之前3. 一个简单的例子4.说明&#xff1a;4.1、autoscan4.2、 configure.scan4.3、aclocal4.4、autoconf4.5、Makefile.am4.6、 automake4.7、Makefilemakefile写法 在 Unix 上写程式的人大概都碰过 Makefile&#xff0c;尤其是用 C 来开发程式…

修改主键的SQL

declare defname varchar(100)declare cmd varchar(500)declare tablename varchar(100)declare keyname varchar(100) Set tablenameTemp1Set keynameid --需要設置的key,分隔 select defname name FROM sysobjects so JOIN sysconstraints sc ON so.id sc.constid …

西安理工大学863(转载)

原创&#xff1a;https://blog.csdn.net/mzj15101229871/article/details/107613162 &#xff08;博主总结的很完整&#xff0c;很厉害&#xff0c;本人为了查看方便&#xff0c;才转载的。本人只是个小白~&#xff09; 第一章 绪论 考试大纲 1&#xff09;了解数据元素、数…

原理简介_消息通信的利器MQTT协议简介及协议原理

- 没用过但是必须得知道系列 -前言&#xff1a;相比于 XMPP&#xff0c; MQTT 的简单轻量受到了不少工程师的喜爱&#xff0c;从物联网到传统的消息服务&#xff0c;简单可依赖的 MQTT 到底为何让人如此着迷呢&#xff1f;MQTT 协议&#xff0d;MQTT 协议简介及协议原理MQTT(Me…

stl vector 函数_vector :: pop_back()函数以及C ++ STL中的示例

stl vector 函数C vector :: pop_back()函数 (C vector::pop_back() function) vector::pop_back() is a library function of "vector" header, it is used to deletes an element from the end of the vector, it deletes the element from the back and returns …