音视频 三 看书的笔记 MediaPlayer的C/S架构

MediaPlayer在运行时分为Client和Server两部分

Client层‌:位于Java层,用户通过调用Java层的API(如setDataSource)来操作MediaPlayer。
Server层‌:位于C++层,负责实际的媒体处理工作。Server层通过Binder机制与Client层进行通信,处理各种媒体操作‌

Binder机制在MediaPlayer中的作用

‌IPC通信‌:MediaPlayer的Client层和Server层通过JNI(Java Native Interface)进行交互,JNI层负责Java层和C++层之间的数据转换和函数调用。C++层的MediaPlayer通过BpMediaPlayerService这个proxy对象与远程服务端的MediaPlayerService(BnMediaPlayerService)进行IPC通信‌
‌会话管理‌:当Server端接收到Client端的请求时,MediaPlayerService会为每一个Client进程创建一个会话,并通过新建一个MediaPlayer::Client对象与其交互。这个对象再根据Client端请求的资源类型来创建相应的Player‌

以setDataSource函数为例,当Java层的setDataSource被调用时,它会通过JNI调用C++层的setDataSource函数。在C++层,setDataSource函数会通过IMediaPlayerService获取服务端的MediaPlayerService,然后调用其create函数来创建一个播放器对象。如果创建成功,再调用该对象的setDataSource方法来设置数据源‌。

status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)
{ALOGV("setDataSource(%d, %" PRId64 ", %" PRId64 ")", fd, offset, le ngth);status_t err = UNKNOWN_ERROR;                                       //赋值一个未知错误状态  类似默认值const sp<IMediaPlayerService> service(getMediaPlayerService());     // 获取Server 端的MediaPlayerServiceif (service != 0) {                                                 //service不为空sp<IMediaPlayer> player(service->create(this, mAudioSessionId));//调用service的create函数if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||(NO_ERROR != player->setDataSource(fd, offset, length))) {player.clear();}err = attachNewPlayer(player);}return err;
}
service的create函数干嘛啊
   sp<IMediaPlayer> MediaPlayerService::create(const sp<IMediaPlayerClient>& client,audio_session_t audioSessionId)
{pid_t pid = IPCThreadState::self()->getCallingPid();int32_t connId = android_atomic_inc(&mNextConnId);sp<Client> c = new Client(this, pid, connId, client, audioSessionId,IPCThreadState::self()->getCallingUid());                  //new ClientALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid,IPCThreadState::self()->getCallingUid());wp<Client> w = c;                                                  // 把构造的Client强引用对象复制成弱引用对象{Mutex::Autolock lock(mLock);                                   //互斥锁mClients.add(w);}return c;
}

new 了个嘛 Client?
在 frameworks/av/media/libmediaplayer-service/MediaPlayerService.h中

class Client:public BnMediaPlayer{
//此处省略一堆代码   
}

Client 对应Java层的MediaPlayer的相关方法。
Client继承关系 Client -> BnMediaPlayer -> IMediaPlayer.
so create函数干了嘛 -> 构造一个Client对象,并将此对象添加到MediaPlayerService类的全局列表mClients中,接着执行setDataSource 方法 player->setDataSource(fd, offset, length) 即 Clients::setDataSource;
so

  sp<IMediaPlayer> player(service->create(this, mAudioSessionId));// 约等于  sp<IMediaPlayer> player(newClient(**))

即player最终是用Client对象初始化的,那么就认为 player === Clent

Client 与 MediaPlayer 啥关系嘞!

对比 c++中 MediaPlayer 与 Client 的函数 发现 哇塞 肿么这么像;
MediaPlayer 与 Client 的函数是一一对应的,两者通过ClientD 代理类联系在一起,有媒婆作怪;
MediaPlayer::attachNewPlayer 就是这个函数搞事

s0 总结

就一个字 :感觉脑袋朦朦的

IPCThreadState 以下是 AI的回答

IPCThreadState 是 Android 中用于处理进程间通信(IPC, Inter-Process Communication)的一个类。它主要用于管理和调度与 Binder 相关的线程状态。以下是对 IPCThreadState 的详细介绍:

1. 什么是 IPC?

在 Android 中,IPC 是一种允许不同进程之间进行通信的机制。由于 Android 应用程序通常在不同的进程中运行,IPC 使得这些进程能够相互发送消息、共享数据和执行操作。

2. Binder

Binder 是 Android 中实现 IPC 的主要机制。它允许不同进程之间通过一个统一的接口进行交互。Binder 提供了高效的通信方式,尤其是在需要跨进程调用时。

3. IPCThreadState 的作用

IPCThreadState 主要负责以下几个方面:

  • 管理线程状态:它跟踪与 Binder 相关的线程状态,包括请求的处理和响应。
  • 请求和响应的调度IPCThreadState 管理来自客户端的请求,并将其分发到相应的服务处理。
  • 同步处理:它确保在多线程环境下对 Binder 交互的正确处理,避免数据竞争和不一致。
4. 主要方法

IPCThreadState 提供了一些关键方法来处理 IPC 过程中的状态:

  • join():使当前线程等待,直到有新的请求到达。
  • setCallingWorkSource():设置调用者的工作源,以便进行更好的资源管理和统计。
  • clearCallingWorkSource():清除当前调用者的工作源设置。
5. 使用示例

通常,开发者不直接使用 IPCThreadState,而是通过更高层次的 API(如 AIDL 或 Binder)来实现进程间通信。IPCThreadState 在底层处理中是透明的。

6. 结论

IPCThreadState 是 Android IPC 机制中的一个重要组成部分,它在后台管理着 Binder 线程的状态和请求处理。虽然开发者通常不直接与其交互,但理解其作用有助于更好地理解 Android 的 IPC 机制和 Binder 的工作原理。

详看 MediaPlayer的C/S架构

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

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

相关文章

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化时处于内网环境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量&#xff1a; 接口&#xff1a; 二、基于环形队列的生产消费者模型 环形队列&#xff1a; 单生产单消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.cc&#xff1a; 多生产多消费实现代码&#xff1a; RingQueue.hpp&#xff1a; main.…

【13】Ajax爬取案例实战

目录 一、准备工作 二、爬取目标 三、初步探索&#xff1a;如何判断网页是经js渲染过的&#xff1f; 四、爬取列表页 4.1 分析Ajax接口逻辑 4.2 观察响应的数据 4.3 代码实现 &#xff08;1&#xff09;导入库 &#xff08;2&#xff09;定义一个通用的爬取方法…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频&#xff1a;https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别&#xff08;红果看广告领金币小实战&#xff09;&#xff1a;https://www.bili…

【更新中】【React】基础版React + Redux实现教程(Vite + React + Redux + TypeScript)

本项目是一个在react中&#xff0c;使用 redux 管理状态的基础版实现教程&#xff0c;用简单的案例练习redux的使用&#xff0c;旨在帮助学习 redux 的状态管理机制&#xff0c;包括 store、action、reducer、dispatch 等核心概念。 项目地址&#xff1a;https://github.com/Yv…

【MySQL】从零开始:掌握MySQL数据库的核心概念(四)

人们之所以不愿改变&#xff0c;是因为害怕未知。但历史唯一不变的事实&#xff0c;就是一切都会改变。 前言 这是我自己学习mysql数据库的第四篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的表格约束&#xff0c;没看的同学可以…

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明&#xff1a;本文内容对应的是 OceanBase 社区版&#xff0c;架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见&#xff1a; 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时&#xff0c;这对数据库的配置等条件提出了较高…

CPU架构和微架构

CPU架构&#xff08;CPU Architecture&#xff09; CPU架构是指处理器的整体设计框架&#xff0c;定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范&#xff0c;决定了软件如何与硬件交互。 主要特点&#xff1a; 指令集架构&#xff08;ISA, Instr…

6.4 模拟专题:LeetCode1419.数青蛙

1.题目链接&#xff1a;数青蛙 - LeetCode 2.题目描述 给定一个字符串 croakOfFrogs&#xff0c;表示青蛙的鸣叫声序列。每个青蛙必须按顺序发出完整的 “croak” 字符&#xff0c;且多只青蛙可以同时鸣叫。要求计算最少需要多少只青蛙才能完成该字符串&#xff0c;若无法完成…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服务 # user li 20250325# 检查当前用户是否为root用户 # 因为配置DNS服务通常需要较高的权限&#xff0c;只有root用户才能进行一些关键操作 if [ "$USER" ! "root" ]; then# 如果不是root用户&#xff0c;输出错误信息echo "…

Leetcode 二进制求和

java solution class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();//首先设置2个指针, 从右往左处理int i a.length() - 1;int j b.length() - 1;int carry 0; //设置进位标志位//从2个字符串的末尾向前遍历while(…

【NLP 49、提示工程 prompt engineering】

目录 一、基本介绍 语言模型生成文本的基本特点 提示工程 prompt engineering 提示工程的优势 使用注意事项 ① 安全问题 ② 可信度问题 ③ 时效性与专业性 二、应用场景 能 ≠ 适合 应用场景 —— 百科知识 应用场景 —— 写文案 应用场景 —— 解释 / 编写…

【NLP 43、文本生成任务】

目录 一、生成式任务 二、seq2seq任务 1.模型结构 2.工作原理 3.局限性 三、自回归语言模型训练 Decoder only 四、自回归模型结构&#xff1a;文本生成任务 —— Embedding LSTM 代码示例 &#x1f680; 数据文件 代码流程 Ⅰ、模型初始化 Ⅱ、前向计算 代码运行流程 Ⅲ、加载…

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu&#xff0c;并且出现下面的错误打印&#xff1a; [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…

Linux之编辑器vim命令

vi/vim命令&#xff1a; 终端下编辑文件的首选工具&#xff0c;号称编辑器之神 基本上分为三种模式&#xff0c;分别是 命令模式&#xff08;command mode&#xff09;>输入vi的命令和快捷键&#xff0c;默认打开文件的时候的模式插入模式&#xff08;insert mode&#x…

第一天学爬虫

阅读提示&#xff1a;我今天才开始尝试爬虫&#xff0c;写的不好请见谅。 一、准备工具 requests库&#xff1a;发送HTTP请求并获取网页内容。BeautifulSoup库&#xff1a;解析HTML页面并提取数据。pandas库&#xff1a;保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

MySQL实战(尚硅谷)

要求 代码 # 准备数据 CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT );DESC employees;CREATE TABLE IF NOT EXISTS departments…

windows下安装sublime

sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…