自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (1)
  • 收藏
  • 关注

原创 Android 中USB-HID协议实现

所有通过USB连接android设备进行通讯的步骤都是大同小异:查询usb设备列表 ——>匹配对应的设备类型(如productid , vendorId)等——>连接usb设备,找到连接通讯的节点——>配置通讯信息,进行通讯。以上是通常的连接usb设备进行通讯的步骤和特点。

2024-06-12 15:02:39 853

原创 Matrix工具抓取ANR

Matrix是一款微信研发并日常使用的应用性能接入框架,支持iOS, macOS和Android。Matrix 通过接入各种性能监控方案,对性能监控项的异常数据进行采集和分析,输出相应的问题分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。@Override@Override@Override@Override@Override@Override//todo 处理性能监控数据。

2024-01-19 17:35:03 452

原创 Android ANR 总结

解决ANR一直是Android 开发者需要掌握的重要技巧,一般从三个方面着手。开发阶段:通过工具检查各个方法的耗时,卡顿情况,发现一处修改一处。线上阶段:这个阶段主要依靠监控工具发现ANR并上报,比如matrix。分析阶段:如果线上用户发生ANR,并且你获取了一份日志,这就涉及了本文要分享的内容——ANR日志分析技巧。

2024-01-18 17:43:09 1196

原创 音视频同步机制

工作闲暇时间,对于之前做音视频项目的一些总结。在音视频项目过程中总会遇到一些问题,比如解码花屏,卡顿等现象,我们可以综合考虑配置一些参数。比如帧率,码率,分辨率等设置均衡。现在说一下重点,就是在项目过程中如何做到音频和视频的同步策略。

2024-01-17 14:29:29 896

原创 编解码的同步和异步机制

同步编解码适用于实时性要求不高的场景,简单易用但可能会导致界面卡顿。异步编解码适用于实时性要求较高的场景,可以提高解码效率和兼容性,但需要额外的线程管理和同步机制。

2024-01-16 15:47:52 407

原创 H264和H265

因为1s中如果不经过编码压缩视频,1s时间需要传输的视频大小是很大的数据量的,比如一个1280x720的分辨率视频,那么不经过编码一秒钟传输的大小为1280x720x60~=843M。).在直播应用的开发过程中,如果把主播端消息事件传递到观众端,一般会以Instant Messaging(即时通讯)的方式传递过去,但因为消息分发通道和直播通道是分开的,因此消息与直播音视频数据的同步性就会出现很多问题。VPS:用于传送应用于多层和子层视频编码所需的信息,提供了整个视频序列的全局性信息。H265码流结构如下。

2024-01-15 15:25:33 849

原创 视频编码中的I、B、P帧

I帧只需考虑本帧;P帧记录的是与前⼀帧的差别;B帧记录的是前⼀帧及后⼀帧的差别,能节约更多的空间,但相视频⽂件⼩了,对来说解码的时候就⽐较⿇烦。因为在解码时,不仅要⽤之前缓存的画⾯,⽽且要知道下⼀个I或者P的画⾯,对于不⽀持B帧解码的播放器容易卡顿。

2024-01-15 10:27:18 489

原创 音视频中的DTS和PTS区别

在视频采集的时候是录制一帧就编码一帧发送一帧,在编码的时候会生成PTS,在通常情况下,编码器在编码一个I帧,然后向前跳过几个帧,用编码I帧作为基准对一个未来帧P帧进行编码,然后跳回到I帧之后的下一个帧。之后编码器会再次跳过几个帧,使用第一个P帧作为一个基准帧编码另外一个P帧,然后再次跳回,用B帧填充显示序列的空隙。P帧由前一个I帧或P帧图像来预测,而B帧由前后的两个P帧或一个I帧和一个P帧来预测。这时候去解码,也是按照收到的视频流一帧一帧去解得了,接收一帧解码一帧,所以解码的顺序的这样的。

2024-01-12 17:48:24 993

原创 SurfaceView和TextureView理解相关

TextureView和SurfaceView都是继承自View类的,但是TextureView在Andriod4.0之后的API中才能使用。SurfaceView可以通过SurfaceHolder.addCallback方法在子线程中更新UI,TextureView则可以通过TextureView.setSurfaceTextureListener在子线程中更新UI,个人认为能够在子线程中更新UI是上述两种View相比于View的最大优势。

2024-01-05 10:39:47 1645

原创 ThreadLocal理解

ThreadLocal实现线程本地存储的原理是比较清晰的,即在当前线程中调用get方法时,通过ThreadLocal的initialValue方法创建当前线程的一个本地数据拷贝,将此拷贝添加到当前线程本地数据的table数组当中;或者在调用set方法时,将当前线程的本地数据存储到当前线程的table数组中.当前线程通过调用ThreadLocal对象的get方法即得到当前线程本地数据对象。

2024-01-04 15:54:24 392

原创 Android中的binder和aidl机制

在 Android 应用程序中,一般都是通过在 AIDL 文件中定义跨进程访问的接口,并通过 Binder 实现这些接口,从而实现应用程序之间的通信。在android framework中提供了Binder类,一个类如果扩展Binder类,那么该类就有提供远程服务的能力,该类对象一旦创建,其内部就会创建一个隐藏的线程,用来接收binder驱动发送的消息,从而调用Binder类的onTransact()方法。Binder 驱动程序通过管理进程间的连接、数据传输等操作,完成了基于 AIDL 的进程间通信功能。

2023-07-16 09:23:00 873

原创 Android中线程池

当线程池需要执行的数量超过一定容量(核心线程数+线程队列最大长度+非核心线程数)时会抛出RejectedExecutionException异常。小结:优先使用核心线程,核心线程用完了就往线程队列里塞,线程队列塞满了再去启动非核心线程,一旦超过了最大线程数,就会抛异常。线程池中最大的并发执行线程数量,因此也引出了非核心线程数(非核心线程数=最大线程数-核心线程数)我们用currentSize表示当前需要执行的线程数,用coreSize表示核心线程数。当线程数超过核心线程数,线程就会放到队列等待执行。

2023-07-15 16:38:36 1566

原创 Android4.4平台相关问题集锦

Android4.4开发的问题集锦

2023-07-06 10:50:59 140

翻译 android中线程Thread

线程包括几个状态创建(new) Thread thread=new Thread;就绪(runnable) thread.start();运行(running) 线程只能从就绪状态进入到运行状态阻塞(blocked) 该状态是线程因为某种原因放弃了cpu使用权限,暂时停止运行阻塞的情况有三种:1)等待:调用了wait(),线程进入等待阻塞状态。此时线程需要等待某项工作的完成2)同步:当线程获取synchronized同步锁失败(此时锁被其他线程暂时占用),线程进入同步阻塞状态...

2020-07-25 11:04:18 1047

翻译 事件滑动冲突

https://juejin.im/post/5cbfaf476fb9a032363933ac

2020-07-23 17:51:42 101

翻译 android中图片三层缓存

三层缓存原理首次加载 Android App 时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中之后运行 App 时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中的图片总之,只在初次访问新内容时,才通过网络获取图片资源网络缓存, 不优先加载, 速度慢,浪费流量本地缓存, 次优先加载, 速度快内存缓存, 优先加载, 速度最快1. 自定义的图片缓存工具类(MyBitmapUtils)通过 new MyBitmapUtils().display(I.

2020-07-23 17:48:30 167

翻译 SparseArray等集合

作为一个Anndroid开发人员来说,我们大多数情况下时使用的Java语言,自然在一些数据的处理时,使用到的集合框架也是Java的,比如HashMap、HashSet等,但是你可否知道,Android因为自身特殊的需求,也为自己量身定制了“专属”的集合类,查阅官方文档,android.util包下,一共捕获如下几个类:SparseArray系列(SparseArray,SparseBooleanArray,SparseIntArray,SparseLongArray,LongSparseArray),以及A

2020-07-23 11:33:59 160

翻译 Android中录像实现MediaMuxer

MediaMuxer最多仅支持一个视频track和一个音频track,所以如果有多个音频track可以先把它们混合成为一个音频track然后再使用MediaMuxer封装到mp4容器中通常视频编码使用H.264(AVC)编码,音频编码使用AAC编码,在MediaFormat中我们可以看到各种编码格式:public static final String MIMETYPE_VIDEO_AV...

2019-11-21 10:28:02 1261 3

翻译 java的三大特性

一,封装1. 封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。2. 封装是怎么实现的呢? a. 需要修改属性的访问控制符(修改为private); b. 创建getter/setter方法(用于属性的读写); c. 在getter/setter方法中加入属性控制语句(用于判断属性值的合法性);public c...

2019-08-27 18:11:27 133

转载 Android中刘海屏幕适配

一、以Android P来区分,P之前是没有API来处理刘海屏幕的,一般是根据各厂商的提供方案来适配屏幕的。二、需要清楚地是:Android P提供提供的刘海屏适配方案1.对于有状态栏的页面,不会受到刘海屏特性的影响,因为刘海屏包含在状态栏中了;2.全屏显示的页面,系统刘海屏方案会对应用界面做下移处理,避开刘海区显示,这时会看到刘海区域变成一条黑边,完全看不到刘海了;3.已经适...

2019-07-09 16:15:56 416 1

转载 java中集合总结

Java中各种集合(字符串类)的线程安全性!!!一、概念:1.线性安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完成之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。2.线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据被污染的情况...

2019-05-18 17:51:57 130

转载 Android电量优化

消耗电量的几个主要原因:1、大数据量的网络传输(网络)2、不停的网络切换(网络)3、解析大量的数据(CPU)1、网络请求之前,检查网络连接。没有网络连接不进行请求2、判断网络类型,针对特定的数据在特定的网络下请求。例如:大量数据传输的时候,在wifi下请求。wifi下下载数据耗电量只有2、3、4G的1/3.3、使用效率高的解析工具。根据具体业务数据量的大小,选择合适的解析...

2019-05-14 11:24:37 171

转载 Android视频流解码

一、硬解码步骤:1.创建MediaCodec:如 MediaCodec.createDecoderByType(keyMime);2.configure codec:配置format,surface等参数3.start codec4.从codec的inputBuffer缓冲区获取一个索引,用于传递解码前的数据(比如h264数据):dequeueInputBuffer,注意如果返...

2019-05-13 17:28:45 3214

转载 Android动画

分类:1.frame (逐帧动画) 2.tween(补间动画) 3.property(属性动画)一、逐帧动画逐帧动画的原理就是让一系列的静态图片依次播放,利用人眼“视觉暂留”的原理,实现动画。实现方式有两种:1.利用 xml 实现逐帧动画 2.利用 Java 代码实现逐帧动画二、补间动画补间动画就是指开发者指定动画的开始、动画的结束的"关键帧",而动画...

2019-05-09 11:37:49 104

翻译 Android线程同步

一、为什么要线程同步因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚。因此多...

2019-05-06 21:42:38 3207

翻译 == 与 equal的区别

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此...

2019-05-06 20:10:43 1101

翻译 Android性能优化方案

Android性能优化有以下一个方面:ANR,内存溢出,内存抖动,内存泄漏,UI卡顿,冷启动优化等方面来回答1.ANR主线程被io操作阻塞(4.0后网络io不允许主线程中)。 主线程做了耗时任务超过 5秒。 Service做了耗时操作超过20秒,这是由于service默认执行在主线程,可以使用IntentService 。 BroadcastReceiver的onReciver做...

2019-05-04 16:34:25 106

翻译 Android中String StringBuffer & Stringbuilder的用法和区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。一.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > StringString最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后...

2019-04-01 10:12:45 1652

翻译 android中activity启动流程

在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity的启动过程整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:一. Step1 - Step 11:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;...

2019-03-18 19:22:11 356

翻译 Service的两种启动方式

Service生命周期.png第一种方式:通过StartService启动Service通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。要创建一个这样的Service,你需要让该类继承Service类,然后重写以下方法: onCreate() 1...

2019-03-18 15:13:53 8111

翻译 Android的启动模式分析

Activity的四种启动模式如下:standard、singleTop、singleTask、singleInstance我们一边讲理论一边结合案例来全面学习这四种启动模式。为了打印方便,定义一个基础BaseActivity,在其onCreate方法和onNewIntent方法中打印出当前Activity的日志信息,主要包括所属的task,当前类的hashcode,之后我们进行测试的A...

2019-03-12 16:26:01 160

翻译 android屏幕渲染机制

优化性能一般从渲染,运算与内存,电量三个方面进行,今天开始说聊一聊Android的渲染机制,我们要知道Android系统每隔16ms就重新绘制一次Activity,也就是说,我们的应用必须在16ms内完成屏幕刷新的全部逻辑操作,即每一帧只能停留16ms,渲染机制说完之后,然后在说如何去优化UI。1.知识储备CPU: 中央处理器,它集成了运算,缓冲,控制等单元,包括绘图...

2019-03-05 17:18:39 1933

转载 View的绘制流程

在进行实际的分析之前,我们先来看下面这张图:我们来对上图做出简单解释:DecorView是一个应用窗口的根容器,它本质上是一个FrameLayout。DecorView有唯一一个子View,它是一个垂直LinearLayout,包含两个子元素,一个是TitleView(ActionBar的容器),另一个是ContentView(窗口内容的容器)。关于ContentView,它是一个Fra...

2019-03-05 15:50:46 167

翻译 java中Int和Integer区别

1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 4、Integer的默认值是null,int的默认值是0 延伸: 关于Integer和int的比较 1、由于Integ...

2019-02-21 16:04:23 85

翻译 Android 中的meta-data及其应用

在日常的Android开发中,AndroidManifest中总会出现一些标签,或是第三方SDK配置信息,或是系统配置,不禁让人思考到底是什么?有什么用?怎么用?有哪些应用场景?meta-data简介<meta-data>直译为“元数据”,该标签可为<activity>、<activity-alias>、<application>、<provi...

2018-07-04 15:53:13 286

翻译 Android 事件分发机制

        事件分发是安卓中非常重要的一个交互机制,是用户和界面交互的基础。Android中与事件分发相关的方法主要包括dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截)、onTouchEvent(事件消费)三个方法.分发: dispatchTouchEvent如果返回true,则表示在当前View或者其子View(子子…View)中,找到...

2018-03-12 11:53:59 135

翻译 Android内存泄漏处理机制

1.1、内存泄露、内存溢出:内存泄露(Memory Leak)指一个无用对象持续占有内存或无用对象的内存得不到及时的释放,从而造成内存空间的浪费 例如,当Activity的onDestroy()方法被调用以后,Activity 本身以及它涉及到的 View、Bitmap等都应该被回收。但是,如果有一个后台线程持有对这个Activity的引用,那么Activity占据的内存就不能被回收,严重时将导致...

2018-03-07 15:26:20 196

翻译 Android app瘦身方案

一、开启minifyEnabled混淆代码在app/build.gradle打开minifyEnabled:android  {    buildTypes  {        release  {            minifyEanbled : true        }    }}二、开启shrinkResources去除无用资源在app/build.gradle打开shrinkReso...

2018-03-06 11:20:22 429

翻译 Handle 消息处理机制

注意,在Activity的onDestory中移除handler消息传递和处理,handler.removeCallbacksAndMessages(null);一、Handler的作用:(1)在非UI线程中完成耗时操作,在UI线程中去更新UI。(2)可以在主线程中发送延时消息。二、为什么Android中要设计为只能在UI线程中去更新UI呢?(1)解决多线程并发问题(根本原因)(2)提高界面更新的...

2018-03-06 10:31:04 1228

Android 中USB-HID协议实现

Android 中USB-HID协议实现

2024-06-12

Android 中USB-HID协议实现

Android 中USB-HID协议实现

2024-06-12

encode_h264_acc.zip

通过安卓底层的mediaCodec对音视频进行硬编码,并实现混合封装成MP4文件,和实现rtmp的视频流推流

2019-11-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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