自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 记录一次Android推流、录像踩坑过程

一般常规的打开camera后(Camera.open(int cameraId)),给相机设置预览setPreviewDisplay(SurfaceHolder holder),holder通过surfaceview获取。此方法既解决了预览问题也解决了息屏获取预览数据问题,但是此方法在MediaMuxer两种模式转换合成音视频时无法合成连续的音视频,如果合成的视频在后续还会卡在某一帧,可以把之前的视频数据队列清空,这样避免因为切换相机之前的垃圾数据导致问题,然后执行上面的步骤。

2024-07-12 15:36:17 1304

原创 ServiceManager的启动和获取

ServiceManager的启动和获取

2023-04-04 14:36:47 965 1

原创 Android设备连接USB摄像头开发记录

2)转化为YUV420P格式的数据后,可以尝试用Android的mediacodec进行硬编码,或者采用X264和FFmpeg进行软编码实现。使用V4L2框架读取摄像头帧数据后,在Java层使用surfaceView的canvas进行渲染。1)由于USB摄像头采集的是JPEG格式的数据,不管怎么样都需要转化为YUV420P格式的数据。使用SuraceView的canvas进行绘制文字。采用V4L2框架,摄像头采集的数据是JPEG格式的数据。4、提供帧率、分辨率大小选择。2、预览画面添加时间。

2023-04-04 09:28:27 1915

原创 Binder ——binder的jni注册和binder驱动

Binder的jni注册和binder驱动

2023-03-09 15:47:47 753

原创 编译ijkplayer步骤流程和遇到的坑

ijkplayer编译

2023-02-14 10:40:33 625

原创 MVX演进史

一般我们开发都会用到架构,MVC MVP MVVM,或者直接不用。1、M: Model 数据/模型:数据的获取以及对数据进行的不依赖view的操作2、V: View 视图:在不同架构中,充当的角色也不一样;xml/composable/kolin3、C/P/VM Controller/ViewModel/Presenter 逻辑:模型与视图之间的交互及数据一、不用任何架构编写代码:会导致一个文件包含所有代码,导致后面的代码越来越臃肿;这种一般适用于功能简单、需求不怎么变化...

2022-04-21 15:22:31 1937

原创 Java网络编程二(Java原生网络编程)

一些常见术语:说到Java原生网络编程,肯定离不开Socket。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。短连接:连接->数据传输->关闭连接传统http是无状态的,浏览器和服务器每次进行一次http请求,就奖励一次连接,但是任务结束后就中断。...

2022-04-20 18:39:41 948

原创 Java网络编程一

1、网络协议计算机网络是什么? 随着计算机技术发展,计算机的体积和价格都在下降,之前计算机多用于研究机构,现价段逐步进入一般的公司用于办公。原来计算机回见传输数据需要通过软盘等第三方存储介质进行转存人们需要将数据直接通通过通信线路传输,来缩短传输时间,于是计算机网络开始诞生,并逐渐发展为现在巨大的Internet。定义和分类:计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机想 捅和通信设备按不停的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息...

2022-04-18 12:18:20 3731

原创 Android热修复

一、热修复:之前在插件化中讲到了如何在家插件,其实热修复也是一样的,不过我们得要把加载的热修复模块放在dexElement数组的前面1、获取当前应用的PathClassLoader2、反射获取到DexPathList属性对象pathList3、反射修改pathList的dexElement1)把补丁包patch.dex转换为Element[](path)2)获得pathList的dexElements属性(old)3)path+ol...

2022-04-16 14:11:14 467

原创 开原框架插件化

插件化1)插件化技术最初源于免安装运行apk的想法2)免安装的apk我们称为插件3)支持插件的APP我们称为宿主插件化解决的问题:1)APP的功能模块越来越多,体积越来越大2)模块之间的耦合度高,协同开发沟通成本越来越来3)方法数目可能超过65535,APP占用内存过大4)应用之间的相互调用插件化和组件化的区别:组件化开发就是将一个APP分成多个模块,每个模块都是一个组件,开发的过程中我们让这些组件相互依赖或者单独调试部分组件等,但是最终发布...

2022-04-14 17:00:32 2481

原创 开原框架组件化

1、什么是组件化,为什么需要组件化2、集成环境/组件化环境自动部署3、组件化 子模块交互方式(非ARouter版)4、组件化 子模块交互方式(ARouter版)早期的单一分层:问题1:无论分包怎么做,随着项目增大,项目失去层次感,后面的人接受很难问题2:包名约束太弱,稍有不注意,就会不同业务包直接相互调用,代码耦合度高问题3:多人开发在版本管理中,容出现代码覆盖冲突等问题1、什么是组件化,为什么需要组件化组件化的意义:不相互一来,可以互相交互,任意组合,耦合度高,自由

2022-04-13 15:49:18 272

原创 开源框架Retrofit

一、Retrofit是什么?准确来说,Retrofit是一个对http网络请求框架的封装,因为网络请求的本质上是OkHttp完成的,而Retrofit仅仅负责网络请求接口的封装。Retrofit的使用: Retrofit retrofit = new Retrofit.Builder() .baseUrl("www.xxx.com") .addConverterFactory(GsonConverterFactory.cre.

2022-04-11 15:02:02 1845

原创 开原框架GLIDE

对于图片加载框架,想必大家用的最多的应该是glide吧。那么除了glide好用之外还有什么其他的有点呢?其实glide的核心思想就是生命周期管理和图片缓存。使用:class GlideTest : AppCompatActivity() { private var URL:String = "www.xxxxx" private var iv: ImageView? = null; override fun onCreate(savedInstanceState

2022-04-10 20:59:09 1104

原创 开原框架OKHTTP

由Square公司贡献的一个处理网络请求的开源项目,是目前Android使用最广泛的网络框架。从Android4.4开始 HttpURLConnection的底层实现采用的是OkHttp。特点:1、支持HTPP/2并允许对同一主机的所有请求共享套接字2、如果非HTTP/2,则通过连接池减少请求延迟3、默认请求GZip压缩数据4、响应缓存,避免了重复请求的网络使用方法:private static void get(String url,OkHttpClient client)

2022-04-09 17:37:02 1441

原创 开原框架RxJava

RxJava想必大家都不陌生,我们先从它的设计模式了解。Rxjava的设计模式RxJava的设计模式采用的是观察者模式,但是又与我们一般的观察者模式不同,我们一般的观察者模式是这样的:RxJava观察者模式:从上图我们可以看出,RxJava是一个观察者,多个被观察者,而且观察者和被观察者之间的耦合度更低。RxJava的核心思想RxJava是怎么做到链式调用的呢,大致思想就是打包和拆包,当我们订阅后,就将我们的数据通过subscribeActual()一层层的打包,然后通.

2022-04-08 03:12:50 1490

原创 WMS(WindowManagerService)分析

首先我们了解一下WMS是什么。1、窗口管理WSM是窗口的管理者,它负责窗口的启动、添加、删除。另外窗口的层级、大小也是由WMS进行管理的。2、窗口动画窗口进行切换时,使用动画可以显得更丝滑一些,窗口动画由WMS的动画子系统来负责,动画子系统的管理者为WindowAnimatior。3、输入系统中转站通过对窗口的触摸从而产生触摸事件,InputManagerService(IMS),会对触摸事件进行处理,它会寻找一个最合适的窗口来处理反馈信息,WMS是窗口的管理者,它作为输入系统的中转

2022-03-28 12:55:38 1102

原创 WindowManager对窗口的操作

前面我们已经讲了,Android的启动过程idle->init->zygote->systemserver->应用进程->activity的启动;这么一个流程。接下里呢,我们来看一下activity上的UI是怎么实现的。首先,我们得要得要对activity、window、view它们之间的关联有一个大致的了解:我们常见的window有:Dialog、PopupWindow、Toast、Activity、输入法窗口等系统window。窗口之间根据分级,展示的次序不

2022-03-26 02:13:25 2279

原创 Binder通信机制(二)

AIDL生成Java类的细节:流程图:有一点要注意的是,IBinder的transact()方法中有个flag参数,0表示同步处理,IBinder.FLAG_ONEWAY表示异步处理。Java层和native层的流程表现:为什么Intent不能传递大数据?Activity的底层通讯是通过Binder,kernel分配给Binder的大小就是size=1M-8K(同步的情况),但是我们直接传1M-8K报错,因为在使用Binder通讯的时候,我们传递、获取数据都会放在一个包内:P

2022-03-24 17:31:49 3108

原创 AMS核心原理讲解

systemserver启动流程关于pid=for(),这个pid和我们的进程PIDsystemserver执行流程:1.createSystemContext(); 1.ContextImpl context = ContextImpl.createAppContext( this, getSystemContext().mPackageInfo); 2.mInitialApplication = context.mPa...

2022-03-23 21:22:10 2107

原创 Android启动流程

总流程:第一步:加载引导程序BootLoader到RAM中,引导操作系统启动第二步:有一个初始化idle进程,主要是初始化进程管理、内存管理等工作;还会创建threadd进程、init进程第三步:init进程(用户空间的鼻祖)主要做的是:第四步:从init进程中fork一个zygote进程(Java进程的鼻祖)第五步:zygote进程fork一个systemserver进程第六步:systemserver进程创建APP进程init进程启动:1、挂载文件2、设置s.

2022-03-23 02:16:29 2472

原创 Binder通信机制(一)

Binder就是Android中的血管,在Android中我们所使用的的Activity,Service等组件都需要和AMS通信,这种跨进程的通信都是通过Binder完成的。机制:Binder是一种通信机制驱动:Binder是一个虚拟物理设备驱动应用层:Binder是一个能发起通信的Java类多进程的使用及优势虚拟机分配给各个进程的运行内存是有限制的,LMK也会优先回收对系统资源占用多的进程1、突破进程内存限制:如有些功能占据内存过多,可以考虑给一个单独的进程2、功能稳定性:

2022-03-22 00:38:53 2372

原创 Handler源码解析

Handler的工作流程我们先从消息的发送和接收切入,也就是handler的工作流程。如何往MessageQueue中放数据queue.enqueueMessage()首先MessageQueue是数据结构是一个优先级队列如何重MessageQueue中取数据呢? 通过Looper.loop()方法从MessageQueue中循环的取,queue.next。从图中可以看出,当队列中没有message时,nextPollTim...

2022-03-20 17:11:45 929

原创 RecycleView回收复用机制

1、回收什么?复用什么?2、回收到哪里去?从哪里获得复用?3、什么时候回收?什么时候复用?当我们滑动的时候什么时候时候复用、回收呢:滑动复用入口(从集合中取):onTouchEvent的move-->scrollByInternal-->scrollStep-->mLayout.scrollVerticallyBy-->scrollBy-->fill-->layoutChunk-->layoutState.next(recycler)-->ad

2022-03-19 15:38:43 549

原创 Android的事件分发(处理)

Android的事件分发:分为View和ViewGroup。View的事件分发,更贴切的可以说是事件处理,毕竟View已经是“最小的”了。上图:ViewGroup的事件分发,可以分发给下面的子View,所有在分发过程中有一个拦截onInterceptTouchEvent()操作。上图:Activity的事件分发处理流程:解决滑动冲突:事件冲突就是,一个事件有多个对个人想要处理,假如处理的对象不是我们想给的对象,就发生了滑动冲突。 ...

2022-03-18 19:52:55 1229

原创 Android自定义View

话不多说,上图:LayoutParams是什么?与MeasureSpec有关系吗?LayoutParams:直接从表面看就知道,是布局的参数。ViewGroup里面的一个静态类public static class LayoutParams { /** * Special value for the height or width requested by a View. * FILL_PARENT means that ...

2022-03-17 17:26:08 1031

原创 深入理解并发编程和归纳总结

CPU和内存之间的关系我们处理业务的话,一般都要用到CPU和内存。假如CPU和内存之间没有一个高速缓冲层区,我们处理数据要从内存中取,CPU计算完之后,又要放到内存;但是内存的读写很慢,这样CPU就只能干等着了,浪费资源。 所以在CPU和内存之间添加了一层读写速度尽可能接近处理速度的高速缓存作为内存和CPU之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。在计...

2022-03-17 01:59:26 203

原创 AQS(AbstractQueuedSynchronizer)同步器

队列同步器AbstractQueuedSynchronizer(以下简称同步器或 AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作。并发包的大师(DougLea)期望它能够成为实现大部分同步需求的基础。AQS使用方式和其中的设计模式AQS是主要使用方式是继承,子类通过继承AQS并实现它的抽象方法来管理同步状态,在AQS里面有一个int型的state来代表这个状态,在抽象方法的实现过程中免不

2022-03-16 21:23:18 382

原创 阻塞队列和线程池原理

队列是一种特殊的线性表,先进先出(FIFO-first in first out)线性表什么是阻塞队列?1、支持阻塞的插入方法:当队列满了,往里面插入元素是,队列会阻塞插入元素的线程,直到队列不满2、支持阻塞的移出方法:当队列为空时,获取元素的线程会等待队列变为非空在并发编程中使用生产者和消费者模式时,一般都是通过阻塞队列形成一个缓冲区,平衡消费者和生产者。一般阻塞队列的方法大致如下:1、抛出异常:当队列满时,如果往队列插入元素,会抛出IllegalStateEx...

2022-03-16 15:51:05 1202

原创 线程与进程理论知识入门(三)

线程的生命周期Java中线程的状态分为6中:1、初始化(new):创建一个新线程对象,但是没还有调用start()方法。2、运行(runnable):Java线程中将就绪(ready)和运行中(running)两者状态统称为“运行”。线程对象在创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程获得CPU的时间片后变为运行中状态(running)。3、阻塞

2022-03-15 17:47:21 627

原创 线程与进程理论知识入门(二)

volatile,最轻量的同步机制volatile保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是立即可见的。举个例子:public class VolatileTest { public static int num = 1; public static boolean isStop = false; public static class UseThread extends Thread{ @

2022-03-13 03:06:05 355

原创 线程与进程理论知识入门(一)

基础概念什么是进程和线程?进程:进程是程序运行资源分配的最小单位其中包括:CPU、内存空间、磁盘IO等,同一条进程中的多条线程共享该进程的全部系统资源,进程与进程之间是相互独立的。线程:线程是CPU调度的最小单位,必须依赖于进程而存在线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的、能独立运行的基本单位。线程基本不拥有系统资源,只拥有一点在虚拟机栈的内存。CPU核心数和线程数关系多核心:指单芯片多处理器,就是将多个并行的处理器集成到同一个芯片内,各个处理器执行

2022-03-12 17:48:34 1928

原创 H264中的PPS和SPS

H264 Profile对视频压缩特性的描述,Profile越高,就说明采用了越高级的压缩特性H264 Level Level是对视频的描述,Level越高,视频的码率、分辨率、pfs越高SPS中的其他重要参数:帧相关: 帧数:log2_max_frame_num_minus4 2的N次方 参考帧数:max_num_ref_frames 给解码器设置缓冲区大小的 显示帧序号:p...

2022-03-08 17:14:35 791

原创 X264参数详解

1、预设值preset: fast/slow,fast一般用于实时通讯,要求速度;slow一般用于点播,保证质量tune: 质量相关,比如:用于电影、动画等不同2、帧相关参数keyint/min-keyint,keyint 设置gopscenecut: 用于场景切换bframes: B帧的数量,一般是3帧ref:参考帧的数量no-deblock/deblock(滤波器):去块化,一般指解码后视频看...

2022-03-08 15:16:00 2962

原创 视频编码(H264编码)

基本步骤:1、打开编码器void open_codecer(int width, int heigth,AVCodecContext **enc_ctx){ int ret = 0 ; AVCodec *codec = NULL; codec = avcodec_find_decoder_by_name("libx264"); if (!codec) { printf("codec libx264 not found\n"); ..

2022-03-08 14:48:11 3884

原创 从视频设备上采集数据(Mac)

1、avdevice_register_all(); // 设备注册2、av_find_input_format("avfoundation"); //获取format3、avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options); //打开device针对于视频来说,options需要设置,FFmpeg的默认编码格式是YUV420,Mac

2022-03-08 12:31:31 3375

原创 音频编码讲解

音频重采样:1、什么是音频重采样:将音频三元组(采样率、采样大小、声道数)的值转换为另外一组值,比如:将44100/16/2转换为44100/32/22、为什么要重采样:从设备采集的音频数据与编码器要求的数据不一致扬声器要求的音频数据与播放的音频数据不一致方便计算:(比如回音消除的时候,就转换为单声道,比起多声道更容易处理)3、如何知道是否需要重采样:了解音频设备参数查看FFmpeg源码...

2022-03-07 19:00:28 582

原创 FFmpeg移植到Android(版本10)后,播放手机上的MP4,avformat_open_input(&formatContext, videoPath, NULL, NULL)返回-13的问题

背景:移植FFmpeg到Android上,自定义一个播放器。打开手机MP4 文件时,avformat_open_input(&formatContext, videoPath, NULL, NULL)返回-13MP4 文件在路径:/sdcard/DCIM/Camera/killer.mp4添加了读写权限。处理:1、尝试用Android自带的mediaplayer播放,依旧无法播放2、在手机手动创建一个文件夹:/sdcard/aatest,放在这个目录下,用mediapl

2022-03-07 14:01:08 2755

原创 音视频基础+ffmpeg原理(视频编码)

H264:H264压缩比条件:1、YUV格式YUV420 2、分辨率:640x480 3、帧率15源码流:640x480x1.5x15,建议码流:500kpbs, 结果:约1/100码流参考值:https://docs.agora.io/cnGOP:gop就是把相似的图片进行分组,一组就是一个gop。H264中的I帧、P帧、B帧: I帧(intraframe frame),关键帧,采用帧内压缩技术。IDR帧属于I帧。而且IDR帧...

2022-03-04 12:45:43 3296

原创 音视频基础+ffmpeg原理(视频基础知识)

图像的基本概念:视频:1、由一组图像组成2、为了传输/占用更小的空间而被压缩3、最终在显示设备上展示(未被压缩)图像:像素:就是一张图片里图片面的一个个小格子RGB:每一个小格子都是由RGB展示出来的分辨率:就是一张图片,横向、纵向有多少个小格子每个像素的位深:就是每一个像素用多少位来表示有:RGB888(24位=3x8)...

2022-03-03 17:40:39 1181

原创 音视频基础+ffmpeg原理(音频编码AAC)

AAC介绍:AAC(Advanced Audio Coding)由Fraunhofer ISS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式最开始是基于MPEG-2的音频编码技术,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术目前常用的规格有AAC LC、AAC HE V1 、AAC HE V2,其中AAC LC、AAC HE V2用的比较多。AAC规格:AAC规格描述:AAC LC:(Low Complexity)低复杂

2022-03-03 14:33:49 431

空空如也

空空如也

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

TA关注的人

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