自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 设计模式之适配器模式

一、适配器模式概述: 适配器模式不是在设计阶段考虑的,而是在系统服役阶段使用的,通常用于拓展新需求。这个模式跟装饰模式类似,都是做了一个包装,只不过该**模式的定义是将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。**在实际应用中,适配...

2020-01-14 09:50:47

阅读数 14

评论数 0

原创 设计模式之责任链模式与装饰模式

一、责任链模式简介: 责任链模式的核心就是“链”,使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式的缺点是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候, 性能是一个非常大...

2020-01-13 09:49:47

阅读数 36

评论数 0

原创 设计模式之中介者模式与命令模式

一、引言: 中介者模式用于处理多个类高耦合的场景,类似于星型拓扑结构,在该结构中抽象出一个中介者,并配备同事类,实现不同的业务逻辑。 该模式有三部分组成:中介者-同事-业务实现类。 抽象中介者定义统一的接口,用于各同事角色之间通信,具体中介者用于协调各同事角色最终的协作,必须依赖各个同事...

2020-01-09 16:34:50

阅读数 13

评论数 1

原创 设计模式之原型模式及clone涉及的深拷贝与浅拷贝探究

一、原型模式介绍: 原型模式的核心就一个clone方法。试想如下的场景,一个对象需要被多个修改者修改或者需要大量的对象但每个对象仅修改一些细节,比如,银行给不同客户发送的具有尊称的定制化信息。不通过new关键字来产生一个对象, 而是通过对象复制来实现的模式就叫做原型模式。原型模式理解上比较简...

2020-01-09 11:49:45

阅读数 11

评论数 0

原创 设计模式之模板方法模式和建造者模式

一、引言: 模板方法模式非常简单,每个人在java代码编写中都会用到,其方针图如下: 实际上,模板方法模式核心就是java的继承机制,父类叫做抽象模板,里面的方法分为两类:一类是基本方法,就是需要子类具体实现的方法,这类方法如果不需要过多的暴露接口,通常使用protected关键字声明,另...

2020-01-07 10:20:57

阅读数 12

评论数 0

原创 设计模式之抽象工厂模式

一、引言: 抽象工厂模式是工厂模式的升级版,书上说,这种模式的使用场景是:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。该模式的设计方针图如下: 从图上可以看出,该模式的封装性非常好,client直接依赖于抽象工厂和抽象产品类就实现了产品的真正产出,也就是...

2020-01-06 18:18:41

阅读数 7

评论数 0

原创 设计模式之工厂模式(factory)

一、引言: 新人学java的时候,工厂模式和代理模式是必须掌握的两种设计模式,工厂模式的方针图如下: 假设我们的产品是一个抽象接口,而我们的具体产品继承自该接口,为了实现工厂模式,我们同样声明了一个工厂接口Creator,里面就是我们需要实现的工厂方法,当我们需要产出一个具体的产品时,自然我们需...

2020-01-06 12:03:37

阅读数 8

评论数 0

原创 设计模式之单例模式(singleton)

一、引言: 单例设计模式是非常常见的一种设计模式,在java中,单例设计模式确保了每个类只有一个实例,其实现的原理是将构造方法声明为private。 二、示例代码: 下面这段代码是最佳的单例模式代码: public class singleton{ public static v...

2020-01-06 11:19:54

阅读数 9

评论数 0

原创 Android音频之多设备同时输出-cast通路分析

一、引言: 有时候,我们在实际处理问题中会遇到这样的需求,播放一段音频或者播报一段语音希望同时从USB/蓝牙类设备和喇叭同时出声,按照Android的audiopolicy策略选择,这是不可行的,因为同一时间,audioflinger只会往一个hal层库里面写数据,而喇叭和USB/蓝牙都不是共用一...

2019-12-27 09:42:06

阅读数 188

评论数 1

原创 Android原生MediaPlayer调用时序图

一、引言: 最近公司的同事经常会问我apk调用mediaplayer接口之后,native层的调用逻辑是什么样的,什么时候去打分播放器,什么时候创建native层的播放器等等,虽说mediaplayer在Android系统仅仅是一个“壳”,但是因为同时涉及apk和下层native,况且,这里面又...

2019-12-18 11:52:58

阅读数 161

评论数 1

原创 Android音频系统之USB设备通路(Android 5.1)

一、引言: 输入/输出通路选择是Android音频中非常重要的一个内容,正常的一个Android系统,会支持喇叭,外放,USB设备或者蓝牙等等输出模组,所以,经常会有项目需要改变原有的策略选择,这类问题通常让人头大,在Android 5.1上面,策略选择是由audiopolicy来做的,audi...

2019-12-12 15:19:56

阅读数 169

评论数 0

原创 Android音频系统之AudioTrack起播线与underrun问题研究(Android 5.1)

一、引言: 使用audiotrack进行pcm数据播放的时候,复杂场景下会遇到underrun问题,所谓underrun,是指生产者提供数据的速度跟不上消费者使用数据的速度。因为网上讲述这类问题的博客很少,所以这里分享一下自己的研究心得,但是由于underrun和audiotrack的buffe...

2019-12-05 17:46:55

阅读数 210

评论数 1

原创 Android音频系统之音量控制详解(Android 5.1)

一、引言: Android的音量控制是典型的audiopolicy和audioflinger协作的例子,博文针对音量调节进行详细的解析.音量控制主要分成两大部分,一部分是java层完成的操作,用于响应音量调节,记录音量值,更新UI等操作,另一部分是native层完成,用于计算音量并执行。需要提一...

2019-12-03 18:22:54

阅读数 194

评论数 0

原创 Android音频系统之AudioTrack与AudioFlinger数据交互

一、前言: 在前面的三篇博客中,分析了AP和AF,AT之间的初始化及流程,因为是按照代码逻辑分析的,所以相对比较按部就班,有些关键和需要串联的地方没有分析到,而这篇博客则是针对一些关键点,进行深入和串联,尽量能将三者的关系结合地更紧密。 二、分析: 1.native层audiotrack中,...

2019-11-27 15:52:48

阅读数 91

评论数 0

原创 Android音频系统之AudioTrack的创建及AudioPolicyService的策略选择(Android5.1)---下篇

一、引言: 在上一篇中,我们着重分析了audiotrack创建过程中audiopolicyservice的表现,通过audiopolicyservice的策略选择,我们找到了一个适合的通路进行音频输出,在整个通路打通之后,我们似乎没有看到用于数据共享的buffer产生,而这个工作,就是由audi...

2019-11-19 14:54:50

阅读数 28

评论数 0

原创 Android音频系统之AudioTrack的创建及AudioPolicyService的策略选择(Android5.1)--- 上篇

一、引言: Android音频的两大服务就是audiopolicyservice和audioflinger,前一篇文章已经分析了audiopolicyservice的启动,而audioflinger的启动并没有什么特别需要分析的地方,但是,如果和audiotrack进行数据交互,那要分析的地方就...

2019-11-19 14:54:38

阅读数 44

评论数 0

原创 Android音频系统之AudioPolicyService的启动及audio_policy.conf的加载(Android5.1)

一、引入: ,在Android中,应用进行音频回放或者录音,最终在hal层需要选择用哪个输入/输出设备,而设备的加载,就跟audio_policy.conf息息相关,本博文分析的内容就是Android原生音频audio_policy.conf加载的过程(Android5.1)。 二、源码分析:...

2019-11-12 10:44:43

阅读数 78

评论数 0

原创 MediaCodec的简单测试sample及部分代码摘要

一、引言: mediacodec在framework层的代码逻辑确实比较复杂,因为对整个通路还不是很熟悉,所以这里摘要一些代码的查看心得,并在网上找了一个demo来了解一下mediacodec是怎么工作的。 二、测试demo: 测试代码摘录自何俊林,demo主要演示了如何渲染一个视频流文件到显示设...

2019-11-05 10:38:01

阅读数 18

评论数 0

原创 ACodec从UninitializedState状态到LoadedState状态分析

一、引言: mediacodec在应用层的逻辑时序图如下(create->start): 进入到native层之后,mediacodec会先去实例化本对象,然后执行init操作, init函数关键代码贴出如下: MediaCodec.cpp status_t MediaCo...

2019-10-25 10:06:06

阅读数 21

评论数 0

原创 Acodec是如何通过其维护的状态来处理AMessage的?

一、问题引言: 初读mediacodec的代码,分析了stagefright框架中大量使用的AHandler、ALooper和AMessage组成的消息机制,我们知道每个AHandler都会通过ALooper去发送消息,然后,最终通过ALooper的loop函数将AMessage分发到各自的AH...

2019-10-24 11:11:12

阅读数 31

评论数 1

原创 MediaCodec中的AHandler、ALooper和AMessage机制简单分析

一、 前言: Android媒体通路中,大量充斥着AHandler、ALooper和AMessage的消息机制,之前简单分析了一下java层的消息机制,而native层的消息机制同java层原理类似,但又有一些区别,所以单独拿来分析一下,在nuplayer和mediacodec中随处可见这种异步...

2019-10-17 17:58:42

阅读数 21

评论数 0

原创 Android中Java层消息机制的简单分析

一、引言: Android中的消息机制主要是用于线程间通信,常见的应用场景有apk中,UI只能在主线程中更新,在子线程中是不能的,这个时候,就需要使用消息机制,让子线程通知主线程更新UI。Android中的消息机制不仅在java层大量使用,native更是频繁,比如媒体的stagefright框...

2019-10-15 17:04:25

阅读数 16

评论数 0

原创 AwesomePlayer架构梳理三:音频处理

一、 简介: awesomeplayer中的音频处理是如下分级的: AwesomePlayer/ └── AudioPlayer ├── AudioSink └── AudioTrack 二、 awesomeplayer流程: 上层mediaplayer调用start指令之后,s...

2019-10-09 16:12:56

阅读数 10

评论数 0

原创 AwesomePlayer架构梳理二:解码器创建

一、上层prepare动作: frameworks\av\media\libstagefright\AwesomePlayer.cpp mediaplayer调用prepare操作,awesomeplayer执行prepare动作,函数调用顺序如下:prepare()->prepare_...

2019-10-09 12:00:31

阅读数 21

评论数 0

原创 AwesomePlayer架构梳理一:构造与解析器的创建

一、 stagefrightplayer引入: mediaplayerservice会在MediaPlayerFactory.cpp中根据URL进行打分,选择出最适合的播放器,对于Android原生的播放器,有stagefrightplayer和nuplayerdriver,Stagefright...

2019-10-09 11:10:11

阅读数 17

评论数 0

原创 mediaplayer在native层的C/S架构关系

一、前言: 本文内容旨在分析native层中mediaplayer是如何获取mediaplayerservice服务的以及他们之间是如何建立联系的,内容前提是建立在你已经知道mediaplayer从java到jni的调用并且熟悉Android中的binder机制。 二、mediaserver的...

2019-10-08 16:43:28

阅读数 23

评论数 0

原创 Android中的binder机制分析二:以精简的语句来提炼binder

一、 个人心得: 网上很多讲binder的书籍和博客,喜欢一上来就从智能指针开始,我个人觉得,对于binder机制的研究,没有必要去深入钻研智能指针,把binder中所有的sp和wp都当成普通的指针就行了,其次,另一个就是一上来开始分析源码, 然后大家就会被各种名词给混淆: BnService...

2019-09-27 18:03:28

阅读数 22

评论数 0

原创 Android中的binder机制分析一:写一个native层最简单的demo

myservice/ ├── Android.mk ├── client │ ├── Android.mk │ ├── main_client.cpp │ └── Main_MyClient.cpp ├── interface │ ├── IMyService.cpp │ └── ...

2019-09-27 11:06:54

阅读数 53

评论数 0

原创 使用NDK进行JNI编程与实践五:使用C/C++代码回调java类中方法

一、需求: 我们将本地方法和被调用的java类公共方法放在同一个类中,本地方法用于调用C/C++代码,在C/C++代码中实现逻辑,用于调用java中公共方法,公共方法中可添加打印之类的确认是否调用成功,逻辑梳理: java native method ---> C/C++ method ...

2019-09-18 11:57:33

阅读数 21

评论数 0

原创 使用NDK进行JNI编程与实践四:数组类传参至C/C++的修改

java中本地方法: 向java的本地方法中传入一个int型数组,在C/C++层将数组中的元素值各自 加10之后返回 /* JNI返回数组arrys并将每个元素的值加10 */ public native int[] intMathod(int[] arrys); ...

2019-09-18 11:16:08

阅读数 13

评论数 0

原创 使用NDK进行JNI编程与实践三:在C/C++代码中修改java类中属性

一、修改java类中非静态属性: java类中代码: public String str = "hello"; /* JNI改变类中变量str的值 */ public native void changeStr(); 中间头文件...

2019-09-18 10:55:25

阅读数 29

评论数 0

原创 使用NDK进行JNI编程与实践二:优化Android studio来进行ndk-build开发

一、 引入: 在JNI开发中,使用javah和ndk-build组合来进行JNI开发的过程比较麻烦,这里介绍一下使用高版本的gradle优化JNI开发,我的环境如下: Android studio:3.5; gradle:5.4.1; 可在任意工程的File->Project Str...

2019-09-17 16:50:27

阅读数 14

评论数 0

原创 使用NDK进行JNI编程与实践一:使用Android studio进行JNI开发

一、 环境需求: java是安卓应用开发的主要语言,但是有时候,我们没有办法直接调用安卓提供的java接口来实现对framework层以下的开发,这个时候,就需要JNI上场了,使用java本地接口,在下面利用C/C++实现对java本地接口的实现,关于JNI编程,网上的资料和博客很多,但是有的很...

2019-09-17 16:22:06

阅读数 13

评论数 0

原创 sonic音频倍速库的使用及探索

前段时间,因为公司业务要求,需要实现音视频的倍速功能,其实现的原理是将音频解码完后的PCM数据进行倍速处理,然后送给同步模块,以音频为准的同步方式实现音视频的倍速。 环境背景:机顶盒Android系统; 一、sonic源码的demo演示: GitHub源码: https://github....

2019-09-09 17:48:08

阅读数 178

评论数 0

原创 live555的rtsp服务器demo功能简单验证

综述:Live555是一款在安防领域非常出名的推流框架,既可以作为rtsp的服务器,也可以作为客户端,这次先使用其作为推流服务器尝下鲜,我的本地环境:Ubuntu14.04; 一、 环境搭建篇: Live555官网:http://www.live555.com/ GitHub上源码位置:https...

2019-07-15 11:04:29

阅读数 75

评论数 0

原创 .bss段和.data段引发的思考

引入:初始化为0的全局变量和静态局部变量真的在.data段吗? 从网上和书上看到的理论都是这么说的:编译阶段结束之后,初始化的全局变量和静态局部变量放在.data段的,而未初始化的全局变量和静态局部变量则是放在了.bss段,今天,饶有兴趣实测了一把,发现似乎有种情况没探讨到,那就是如果初始化的值...

2019-07-05 16:55:28

阅读数 30

评论数 0

提示
确定要删除当前文章?
取消 删除