文档章节

Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

天王盖地虎626
 天王盖地虎626
发布于 01/19 17:26
字数 1469
阅读 3
收藏 0

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 
看下Java层一个方法在c++层 MediaPlayer后续过程 
frameworks/av/media/libmedia/MediaPlayer.cpp 
找一个我们之前熟悉的setDataResource方法看下C/S模式的过程,亦可参考Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程中的图,了解整体上C/S架构。先看下Agenda:

举例setDataSource方法在mediaplayer.cpp之后发生了什么?
Client到底是什么?
Client及MediaPlayer是什么一种关系?
IMediaPlayer.h,mediaplayer.h,IMediaPlayerClient分别做什么?
举例setDataSource方法在mediaplayer.cpp之后发生了什么?
先看下setDataSource方法:

对应看下MediaPlayerService.cpp中createt函数,这里说下MediaPlayerService.cpp位置,6.0源码中是在frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp中。如下:

在new Client中,有一个IPCThreadState,这里介绍下: 在Android中ProcessState是客户端和服务端公共的部分,作为Binder通信的基础,ProcessState是一个singleton类,每个 
进程只有一个对象,这个对象负责打开Binder驱动,建立线程池,让其进程里面的所有线程都能通过Binder通信。 
与之相关的是IPCThreadState,每个线程都有一个IPCThreadState实例登记在Linux线程的上下文附属数据中,主要负责
Binder的读取,写入和请求处理框架。IPCThreadState在构造的时候获取进程的ProcessState并记录在自己的成员变量mProcess中,通过mProcess可以获得Binder的句柄。详细了解ProcessStata及IPCThreadState源码,可以参考:《Binder中的ProcessState和IPCThreadState分析》,写的很不错,IPCThreadState通过IPCThreadState::transact把data,及handle等填充入binder_transaction_data,在两个进程间通信。

Client到底是什么?
这里这个Client到底是什么?我们又得追踪下,在frameworks/av/media/libmediaplayerservice/MediaPlayerService.h如下:

以上代码没有省略,是因为确实对我们理解从Java层过来的MediaPlayer相关方法,在这都有对应。如果还记得前面《Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程》文章中那个图的话,可以从整体上理解这个Client属于什么角色及位置。继承BnMediaPlayer,并包含了IMediaPlayer相关接口。
总结下上面代码:Client类的继承关系为:Client->BnMediaPlayer->IMediaPlayer分析上面代码,可以看出create方法,是构造了一个Client对象,并且将此client对象添加到mediapalyerservice类的全局列表中:mClients,是一个SortedVector,紧接着执行player->setDataSource(url, headers),即Clients::setDataSource,因此在setDataSource中的

语句相当于

即player最终是用Client对象来初始化,可以直接认为player==client 
本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52435789

Client及MediaPlayer是什么关系?
这是候问题来了?在C++中,这个Client及MediaPlayer又是什么一种关系呢?

Client是MediaPlayerService内部的一个类,我们从上面代码已知,因为MediaPlayerService运行在服务端,故Client也是运行在服务端。
Client在MediaPlayerService.h中,那接着看下MediaPlayerService中的实现,实现过程中调用过了MediaPlayerService类的一些函数,同样回到setDataSource

接下来看MediaPlayer中,以下代码中在frameworks/av/include/media/mediaplayer.h中:


这里函数和Client中的函数时一一对应的,两者通过Client的代理类联系在了一起。


上面两个函数,一个是MediaPlayer的setDataSouree,然后里面会调到attachNewPlayer函数,这个函数最终会调用到服务端Client的对应的函数, 
本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52435789

IMediaPlayer.h,mediaplayer.h,IMediaPlayerClient分别做什么?
到这里,可能有人会想:IMediaPlayer.h,及mediaplayer.h的区别是什么?总结主要如下(另加一个IMediaPlayerClient.h,一起介绍):

从包结构:首先IMediaPlayer和IMediaPlayerClient.h都是在frameworks/av/media/libmedia包下,而mediaplayer.h是在/av/include/media包下。(前面已有代码贴出)
从功能上看:它们担当职责也不一样
这里贴出IMediaPlayer.h及IMediaPlayerClient.h代码: 
IMediaPlayer.h位于frameworks/av/media/libmedia下:


IMediaPlayer.h中定义的基本上都是虚函数,而我们知道虚函数在C++中就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。所以它的功能是一个实现MediaPlayer功能的接口,看到那个onTransact方法,自然联想Binder通信,把底层的Parcel指针类型数据向上层向另一个进程中传递。 
再看下IMediaPlayerClient.h,同样位于frameworks/av/media/libmedia下:


上面代码总结为:在内部定义一个BpMediaPlayerClient(也就是Client的父类),然后它也有一个onTransact,一般onXXX都是属于背动回调过来的,不是由自己控制,如Activity中onCreate,onPause,onStart,这些都是在其他地方处理,通知到Actvitity中的。这里也是一样,onTransact作为Binder通信中的回调方法,前面《Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程》中介绍到player实际上是C/S模式整体,IMediaPlayerClient.h的功能是描述一个MediaPlayer客户端的接口。

最后总结下:mediaplayer.h的功能是对外(jni层)的接口类,它最主要是定义了一个MediaPlayer类(C++层),我们在android_media_MediaPlayer.cpp中就引入了media/mediaplayer.h,IMediaPlayer.h则是一个实现MediaPlayer(C++层)功能的接口,而IMediaPlayerClient.h的功能是描述一个MediaPlayer客户端(这里暂理解为前面说的Client)的接口。

 

本文转载自:https://blog.csdn.net/hejjunlin/article/details/52435789 

共有 人打赏支持
天王盖地虎626
粉丝 22
博文 222
码字总数 7329
作品 0
南京
私信 提问
LLVM 与 Clang 及其关系

随着 Android P 的逐步应用,越来越多的客户要求编译库时用 libc++ 来代替 libstdc++。libc++ 和 libstdc++ 这两个库有关系呢?它们两个都是 C++ 标准库,libc++ 是针对 Clang 编译器特别重写...

robslove
01/17
0
0
思科上海研发中心诚聘Android开发工程师(25W - 40W)

有意者,请发简历至crdc-ucbu-recruit@cisco.com. Cisco SCMBU (Soft Clients and Mobility BU) is looking for talented Android developers. What you need for this position: * Maintain......

yunzhu
2012/03/01
5K
21
Android Multimedia Framework 架构--base on jelly...

转载请注明出处:太妃糖出品。哈哈 我们学习一种新事物必然首先都要对该事物要有个大体的了解,熟悉它的整体架构,然后进行划分归类,接下来才是各个击破,逐步学习乃至掌握。对于要学习and...

tjy
2012/08/23
0
0
Android NDK C++开发注意事项总结

相信Android开发者都喜欢用C++编写一些高效的应用,有关Android NDK的C++开发相关知识总结如下: 从Android NDK r5开始支持了STL Port,在这个版本开始就可以使用部分STL库的功能了,比如说v...

阿酷
2011/10/21
1K
0
Android 4.0 源代码结构

21、Android 4.0 源代码结构 Android源码的第一级目录结构 一、abi(ABI:application binary interface,应用程序二进制接口) abi文件的目录结构如下: 其中基本全部都是.cc的文件,打开其中...

SibylY
2014/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【kafka】kafka集群搭建

简介 要配置kafka,首先要配置zookeeper保证集群的高可用。因此本教程包含两者的配置。 1、下载kafka:https://www.apache.org/dyn/closer.cgi?path=/kafka/2.1.0/kafka_2.11-2.1.0.tgz 2、下...

Areya
36分钟前
2
0
iOS图片拉伸之神属性:resizableImageWithCapInsets

在仿写QQ会话窗口的时候,气泡的背景图片拉伸问题。并不是所有地方都可以拉伸的,所以定义了下面的工具类中的一个方法,专门拉伸图片。 UIImageResizingModeStrech:拉伸模式,通过拉伸UIEdg...

壹峰
42分钟前
1
0
Syncfusion教程:在Xamarin.Forms中创建数据输入表单 (2)

下载Essential Studio for Xamarin最新版本 Essential Studio for Xamarin是全面的Xamarin.iOS、Xamarin.Android和Xamarin.Forms组件套包,包含最快的图表和网格。 如何将Syncfusion输入控件...

电池盒
55分钟前
0
0
Infor宣布首次公开募股

为特定行业提供商业云软件的全球领先提供商Infor今天宣布达成协议,获得科氏控股发展有限公司(KED , Koch Equity Development, LLC)以及金门资本(Golden Gate Capital)15亿美元投资。 继201...

linux-tao
今天
1
0
Mysql索引总结

由于Mysql的索引是B-tree或B+tree,所以下面会先涉及到一些树的概念。 1、二叉树特性:左子树的键值小于根的键值,右子树的键值大于根的键值。 2、平衡二叉树是为了减小树的深度从而减小查找...

浮躁的码农
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部