音视频 二 看书的笔记 MediaPlayer
此类是用于播放声音和视频的主要 API
对方不想多说向你丢了一个链接 MediaPlayer
- Idle 空闲状态
- Initialized 初始化状态 调用 setDataSource() 时会进入此状态 setDataSource必须在Idle 状态下调用,否则就抛出异常了了了了了。
- Prepared 准备状态 回调监听setOnPreparedListener 进入此状态后 可以设置一些属性 例如音量/循环播放等
- Started
- Paused
- PlaybackCompleted 播放完了状态
- Stopped
- End 调用release() 就结束
- Error 错误状态 播放过程中错误 会 回调到OnErrorListener.onError 此时应嗲用reset方法使MediaPlayer 恢复到Idle状态。
创建 过程
Android MediaPlayer.create(Context context, Uri uri) 的创建过程:
```
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder,
AudioAttributes audioAttributes, int audioSessionId) {
try {MediaPlayer mp = new MediaPlayer(audioSessionId);final AudioAttributes aa = audioAttributes != null ? audioAttributes :new AudioAttributes.Builder().build(); //音频属性mp.setAudioAttributes(aa); //设置音频属性mp.native_setAudioSessionId(audioSessionId); //音频会话ID mp.setDataSource(context, uri); //设置资源if (holder != null) { //控制器 操纵Surfacemp.setDisplay(holder);}mp.prepare(); //准备return mp;} catch (IOException ex) {Log.d(TAG, "create failed:", ex);// fall through} catch (IllegalArgumentException ex) {Log.d(TAG, "create failed:", ex);// fall through} catch (SecurityException ex) {Log.d(TAG, "create failed:", ex);// fall through}return null;
}
简化过程
val mediaPlayer = MediaPlayer()
mediaPlayer .setDataSource(file.path)
mediaPlayer .prepare()
说明创建 就需要 new MediaPlayer()
接下来我们看看 MediaPlayer的构造方法?
我替大家看了!定义了个Looper myLooper不为空赋值 MainLooper不为空赋值
创建EventHandler对象
创建了个TimeProvider
创建了个Vector<InputStream>
然后native_setup()
naive方法 都是先加载 native文件
static {System.loadLibrary("media_jni");native_init();}
s0 我们先看 native_init()
env -> FindClass("android/media/MediaPlayer") //调用java层,搞到MediaPlayer
env -> GetFieldID(clazz,"mNativeContext","J“) 搞到mNativeContext
env -> GetStaticMethodId(clazz,"postEventFromNative","参数类型省略")
就是下边的
public class MediaPlayer extends PlayerBaseimplements SubtitleController.Listener, VolumeAutomation, AudioRouting
{//省略一堆private long mNativeContext; // accessed by native methods/** Called from native code when an interesting event happens. This method* just uses the EventHandler system to post the event back to the main app thread.* We use a weak reference to the original MediaPlayer object so that the native* code is safe from the object disappearing from underneath it. (This is* the cookie passed to native_setup().)*/private static void postEventFromNative(Object mediaplayer_ref,int what, int arg1, int arg2, Object obj){//省略一堆if (mp.mEventHandler != null) {Message m = mp.mEventHandler.obtainMessage(what, arg1, arg2, obj);mp.mEventHandler.sendMessage(m);}
}
//省略一堆}
postEventFromNative 把Natvie事件回调到Java层,使用EventHandler post事件到主线程中,软引用指向原生MediaPlayer,保证Native代码的安全。
接下来native_setup 干了啥
sp<MediaPlayer> mp = new MediaPlayer();
sp listener = new JNIMediaPlayerListener(env,this,weak_this)
mp->setListener(listener)
setMediaPlayer(env,thiz,mp);
就是创建native MediaPlayer 创建回调
setDataSource 过程
文件非 文件 分开判断处理
文件资源 最终调用 _setDataSource 的映射 setDataSoureceFD
1 获取MediaPlayer对象
2 获取java.io.FileDescriptor
3 检测异常及抛出
非文件资源 nativeSetDataSource 映射 setDataSoureceAndHeaders
1 获取MediaPlayer对象
2 通过Binder机制 最后强制转换获取IMediaHTTPService
3 检测异常及抛出
setDisplay 设置控制器
prepare后的流程
运行时 MediaPlayer 大致可分为 C S 两个部分,在两个进程中运行,通过Binder机制视频IPC通信。
给播放器设置数据源之后。调用prepare 或 prepareAsync。
文件类型,调用prepare 将暂时阻塞,直到回调onPrepared进入Prepared状态。
public void prepare() throws IOException, IllegalStateException {_prepare();scanInternalSubtitleTracks();// DrmInfo, if any, has been resolved by now.synchronized (mDrmLock) {mDrmInfoResolved = true;}}
调用natvie方法prepare()
简单描述(其实也云里雾里),其他自行脑补领悟百度deep,
获取mediaplayer
getVideoSurfaceTexture
setVideoSurfaceTexture(上边get到的)
检测异常
prepareAsync()
public native void prepareAsync() throws IllegalStateException;
多了点 锁 判断状态 等待之类的
Start()
stayAwake(true); 屏幕操作
/*** Set the low-level power management behavior for this MediaPlayer. This* can be used when the MediaPlayer is not playing through a SurfaceHolder* set with {@link #setDisplay(SurfaceHolder)} and thus can use the* high-level {@link #setScreenOnWhilePlaying(boolean)} feature.** <p>This function has the MediaPlayer access the low-level power manager* service to control the device's power usage while playing is occurring.* The parameter is a combination of {@link android.os.PowerManager} wake flags.* Use of this method requires {@link android.Manifest.permission#WAKE_LOCK}* permission.* By default, no attempt is made to keep the device awake during playback.** @param context the Context to use* @param mode the power/wake mode to set* @see android.os.PowerManager*/public void setWakeMode(Context context, int mode) {boolean washeld = false;/* Disable persistant wakelocks in media player based on property */if (SystemProperties.getBoolean("audio.offload.ignore_setawake", false) == true) {Log.w(TAG, "IGNORING setWakeMode " + mode);return;}if (mWakeLock != null) {if (mWakeLock.isHeld()) {washeld = true;mWakeLock.release();}mWakeLock = null;}PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);mWakeLock = pm.newWakeLock(mode|PowerManager.ON_AFTER_RELEASE, MediaPlayer.class.getName());mWakeLock.setReferenceCounted(false);if (washeld) {mWakeLock.acquire();}}
以下是几种模式 对CPS 屏幕 键盘的影响自行搜索
最终调用
private native void _start() throws IllegalStateException;
额 就这吧 瘫了!
相关文章:
音视频 二 看书的笔记 MediaPlayer
此类是用于播放声音和视频的主要 API 对方不想多说向你丢了一个链接 MediaPlayer Idle 空闲状态Initialized 初始化状态 调用 setDataSource() 时会进入此状态 setDataSource必须在Idle 状态下调用,否则就抛出异常了了了了了。Prepared 准备状态 回调监听setOnPrep…...
可以把后端的api理解为一个目录地址,但并不准确
将后端的 API 理解为一个“目录地址”是可以的,但并不完全准确。让我们更详细地解释一下。 目录 1、生动形象了解api 2、后端 API 的作用 3、可以将 API 理解为“目录地址”的原因 (1)URL 路径 (2)层次结构 4、…...
vscode连接服务器失败问题解决
文章目录 问题描述原因分析解决方法彻底删除VS Code重新安装较老的版本 问题描述 vscode链接服务器时提示了下面问题: 原因分析 这是说明VScode版本太高了。 https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distribu…...
Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject
一、前言 JSON作为轻量级的数据交换格式,已成为开发者必备技能。Qt框架为JSON处理提供了完整的解决方案,通过QJsonDocument、QJsonObject和QJsonArray三大核心类,轻松实现数据的序列化与反序列化。 JSON vs INI 特性JSONINI数据结构支持嵌…...
开源视频剪辑工具,无损编辑更高效
LosslessCut 是一款基于 FFmpeg 开发的跨平台开源视频剪辑工具,致力于无损处理音视频文件。它无需重新编码即可完成剪切、合并、轨道编辑等操作,极大地保留了原始文件的质量,特别适合处理大体积视频,如无人机拍摄素材或长时录制内…...
Git 之配置ssh
1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com...
(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器
看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写? 文章介绍了第一种写法id选择器,其实XPath元素定位要比CSS好用,原因是CSS无法使用下标(工作当中也是常用的xpath),但CSS定位速度比XPat…...
Mysql---锁篇
1:MySQL 有哪些锁? 全局锁 flush tables with read lock 整个数据库就处于只读状态了 unlock tables 释放全局锁 全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数…...
Django 项目打包exe本地运行
Django 项目打包exe本地运行 记一次离谱的需求 其实本来觉得Django项目架构比较清晰,代码逻辑也简单,没打算记笔记,结果遇到离谱需求折腾了很久 开发了一个Django项目,到交付的时候了,客户说自己没有服务器… 没服务器还要登录功能😓 没办法,甲方最大,整吧 第一…...
20250330 Pyflink with Paimon
1. 数据湖 2. 本地安装Pyflink和Paimon 必须安装Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手动加入这两个jar 测试代码: import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…...
RTMP推流服务器nginx在linux上的编译部署
RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…...
Matlab教程001:软件介绍和界面使用
1.1 软件介绍 1.1.1 Matlab的介绍 MATLAB(MATrix LABoratory)是一款由 MathWorks 公司开发的高级编程语言和交互式环境,广泛用于 科学计算、数据分析、机器学习、工程建模、仿真和信号处理 等领域。 1.1.2 主要应用领域 数据分析与可视化…...
【SQL Server数据库备份详细教程】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
Java设计模式之解释器模式
概念 解释器模式是一种行为型设计模式,用于定义一种语言的语法规则,并提供解释器来解释该语言中的表达式。 作用 其核心作用是将复杂的语法分解为简单的语法单元,通过递归组合的方式构建抽象语法树(AST),…...
el-date-picker时间范围 编辑回显后不能修改问题
el-date-picker daterange时间范围 编辑回显后不能修改 <el-form-item:label"LABELS.gplanRecordDateLabel"prop"gplanRecordDate"><el-date-pickerstyle"width: 300px"v-model"formData.gplanRecordDate"type"daterang…...
vue复习1~45
1.关于vue 要理解记忆规则,可以到官网上去找 vue的两种使用方式 vue核心包开发 场景:局部模块改造vue核心包 & vue插件 工程化开发 场景:整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…...
Servlet开发与生命周期详解-2
一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多,其中目前使用比较多的是: IntelliJ IDEA(这个居多,IDEA在提示功能方面要强于Eclipse,也就是说IDEA使用起来比Eclipse更加智能,更好用。JetBrai…...
vue2项目eslint提示<template v-for> key should be placed on the <template> tag
在template标签上使用v-for时,vue2会提示key不可放在template标签上,必须放在子元素上。vue3会提示key必须放在template标签上。这时候可能我们怎么写都会触发eslint校验提醒。不影响使用,但看着难受。 我们可以在根目录上新建jsconfig.json…...
老是忘记package.json,备忘一下 webpack 环境下 Vue Cli 和 Vite 命令行工具对比
Vue 2.X webpack 环境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…...
关于跨域问题(本地前端访问服务器端接口跨域出错)
问题来源: 当服务器封装了接口但是本地电脑端前端访问出现跨域问题。 解决方案; 1、使用ipconfig 查看本地电脑的ip地址 ipconfig 2、在后端接口处配置如下代码 allow_origins["http://本地ip地址:3001", # 局域网内其他设备访问的本地…...
Jackson相关问题
1、json转dto的时候,dto不能定义isActive这种带有is的前缀,如果使用Lombok的Getter/Setter的话,json {"isActive": true},这样,将无法正确赋值。此时的dto再次转为json之后,得到的是active:false…...
【C++】互斥锁(Mutex)和原子操作(Atomics)
详细探讨 C 中的并发、多线程、互斥锁(Mutex)和原子操作(Atomics)的概念及其区别,并附带代码示例。 1. C 并发与多线程 (Concurrency vs. Multithreading) 并发 (Concurrency):指系统能够处理多个任务的能…...
Linux--命令行操作
一、Linux的作用 1.简单的文件操作 2.编程 3.支持系统和网络 二、多账号管理 1、我们需要在root账号下进行,可以用whoami来查询账号身份 2、adduser 你要创建的账号名 就可以创建一个账号 3、ls /home可以查看账号是否创立 4、使用passwd 创建账号名字的来设…...
具身系列——Diffusion Policy算法实现CartPole游戏
代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型(Diffusion Model)的强化学习策略网络。扩散模型通过逐步去噪过程生成动作,核心思想是: • 前向过程:通过T步逐渐将专家动作添加高斯噪声,最终变成…...
4.用 Excel 录入数据
一 用 Excel 录入数据的两种方式 用鼠标键盘录入数据和从网上爬取数据。 二 用鼠标键盘录入数据 1.录入数据的规范 横着录入数据(横着一条条录入数据)。 2.使用快捷键进行数据录入 tab 键和 enter 键。 tab 键:向右移动一个单元格。 tab 键…...
nginx配置跳转设置Host有误导致报404问题
我们有个项目,前端调用了第三方接口。为了避免跨域,所以使用nginx进行转发。一直正常工作,相安无事。近日第三方调整了安全策略,http转换成https,原本使用ip,现在也改成使用域名,所以nginx这里我…...
接口/UI自动化面试题
一、UI自动化 1.1、接口和UI自动化有多少用例? 回答策略:根据接口设定用例,100个接口,自动化case在1500-2000左右。结合自身的项目,回答覆盖的主功能流程。 示例: 接口自动化的测试case一般需要根据接口数…...
Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项
以下是 Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项: 1. 常见语言模型 API 选择 (1) OpenAI API 特点:支持 GPT-3、GPT-3.5、GPT-4 等模型&a…...
搜广推校招面经六十
soul推荐算法 一、word2vec原理 参考一篇文章入门Word2Vec 二、word2vec正负采样怎么做的、word2vec采用的loss和原理 见【搜广推校招面经四、搜广推校招面经五十二、搜广推校招面经五十七】 不太理解为啥问这么多word2vec,索性直接整理一遍。 三、多路召回融合…...
红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式
红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 工厂模式和原型模式解析 一、工厂模式:像订外卖一样创建对象 工厂模…...
Flutter完整开发实战详解(一、Dart语言和Flutter基础)
前言 在如今的 Flutter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何快速从0开发一个完整的 Flutter APP,配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧,并针对…...
Kafka 偏移量
在 Apache Kafka 中,偏移量(Offset)是一个非常重要的概念。它不仅用于标识消息的位置,还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…...
手撕LRU缓存Java版(带输入输出)
由于面试手撕lru没撕出来,导致心态炸裂,今天特地练习了lru输入输出 手撕版,在每个函数里手动加上输出 public class LC146 {static class LRUCache{class Node{int key, value;Node prev, next;Node(int key, int value){this.key key;thi…...
Android 12系统源码_系统启动(二)Zygote进程
前言 Zygote(意为“受精卵”)是 Android 系统中的一个核心进程,负责 孵化(fork)应用进程,以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程,后续所有…...
python之并发编程
并发编程介绍 串行、并行与并发的区别 进程、线程、协程的区别 1. 进程 (Process) 定义:进程是操作系统为运行中的程序分配的基本单位。每个进程都有独立的地址空间和资源(如内存、文件句柄等)。特点: 进程是资源分配的基本单位…...
极速全场景 MPP数据库starrocks介绍
目录 一、引子 二、起源 (一)前身 (二)定位 三、特点 (一)高性能架构 (二)实时分析 (三)高并发与扩展性 (四)兼容性与生态 …...
MySQL 表连接(内连接与外连接)
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1、表连接的核心概念 1.1 为什么需要表连接? 2、内连接&a…...
重学Java基础篇—什么是快速失败(fail-fast)和安全失败(fail-safe)?
快速失败(fail-fast) 和 安全失败(fail-safe) 是两种不同的迭代器设计策略,主要用于处理集合(如 List、Map)在遍历过程中被修改的场景。 它们的核心区别在于对并发修改的容忍度和实现机制。 1…...
Redis 集群配置
在币圈交易所,Redis 集群的节点数量和内存大小通常根据交易所的规模、访问量、并发需求等因素来决定。一般来说,可以按照以下标准配置: Redis 集群节点数量 小型交易所(日活 < 10万,QPS < 10k)&…...
容器C++
string容器 string构造函数 #include<iostream> using namespace std; #include<string.h> void test01() {string s1;//默认构造const char* str "hello world";string s2(str);//传入char*cout << "s2" << s2 << endl;s…...
Git 基础入门:从概念到实践的版本控制指南
一、Git 核心概念解析 1. 仓库(Repository) Git 的核心存储单元,包含项目所有文件及其完整历史记录。分为本地仓库(开发者本地副本)和远程仓库(如 GitHub、GitLab 等云端存储),支持…...
蓝桥杯真题_小蓝和小桥的讨论
小蓝和小桥的讨论 问题描述 小蓝和小桥是一所高中的好朋友,他们正在讨论下一次的课程。这节课需要讨论 nn 个主题,第 ii 个主题对老师来说有 aia**i 的趣味度,对学生来说有 bib**i 的趣味度。 小蓝认为,如果一个主题对老师来说…...
【C++游戏引擎开发】《线性代数》(2):矩阵加减法与SIMD集成
一、矩阵加减法数学原理 1.1 定义 逐元素操作:运算仅针对相同位置的元素,不涉及矩阵乘法或行列变换。交换律与结合律: 加法满足交换律(A + B = B + A)和结合律( ( A + B ) + C = A + ( B + C ) )。 减法不满足交换律(A − B ≠ B − A)。1.2 公式 C i j = …...
HTML应用指南:利用POST请求获取全国小鹏汽车的充电桩位置信息
在新能源汽车快速发展的背景下,充电桩的分布和可用性成为影响用户体验的关键因素之一。随着全球对环境保护意识的增强以及政府对新能源政策的支持,越来越多的消费者倾向于选择电动汽车作为日常出行工具。然而,充电设施是否完备、便捷直接影响…...
工具介绍《WireShark》
Wireshark 过滤命令中符号含义详解 一、比较运算符 Wireshark 支持两种比较运算符语法:英文缩写(如 eq)和 C语言风格符号(如 ),两者功能等价。 符号(英文缩写)C语言风格符号含义示…...
深入理解 Linux 中磁盘空间驱动的编写:从原理到实践
在编写 Linux 内核中的磁盘空间驱动时,理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类:采用 MTD(Memory Technology Device)模式的原始闪存设备(如 NAND、NOR Flash)&…...
flutter android端抓包工具
flutter做的android app,使用fiddler抓不了包,现介绍一款能支持flutter的抓包工具Reqable,使用方法如下: 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk…...
知识周汇 | 用 matplotlib 轻松绘制折线图、散点图、柱状图、直方图
目录 前言 折线图 散点图 柱状图 直方图 组合图:柱状图和折线图 1. 导入库 2. 定义组合图函数 3. 设置中文字体和样式 4. 创建画布和子图 5. 绘制柱状图 6. 绘制折线图 7. 美化图表 8. 保存和显示图表 9. 调用函数 总结 前言 matplotlib 是 Python…...
Ribbon负载均衡的深度解析与应用
在微服务架构中,服务之间的调用频繁且复杂,因此负载均衡显得尤为重要。Spring Cloud生态系统中,Ribbon作为一个客户端负载均衡器,扮演着关键的角色。它不仅能提高系统的响应速度,还能确保系统的稳定性和可用性。接下来…...
Neo4j GDS-06-neo4j GDS 库中社区检测算法介绍
neo4j apoc 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j APOC-01-图数据库 apoc 插件安装 neo4j on windows10 Neo4j APOC-03-图数据库 apoc 实战使用使用 Neo4j APOC-04-图数据库 apoc 实战使用使用 apoc.path.spanningTree 最小生成树 Neo4j APOC-05-图数据库 apo…...