![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 73
相互交流
SYOICQ
这个作者很懒,什么都没留下…
展开
-
音频的裁剪、合成、给MP4文件混合背景音频
学习目标:音频的裁剪、合成、小例子学习内容:一、音频的裁剪1.程序思路把一段mp3文件裁剪生成一个新的mp3文件,我们通过对一段视频进行解析出pcm码流,然后输出对应的时间段的pcm视频流,然后在这段视频流前面添加wav头部,生成mp3文件,这样就裁剪完成了。有关添加wav头部的实现请看下面的链接:音频之WAV格式编码解析解析mp3文件代码如下:MediaCodec mediaCodec = null; MediaExtractor mediaExtractor原创 2021-08-01 15:56:18 · 601 阅读 · 1 评论 -
音频之WAV格式编码解析
学习目标:音频之WAV格式编码解析学习内容:介绍WAV是最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。它符合资源互换文件格式(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。WAV格式名称占用字节数计算公式对应16进制解释原创 2021-07-28 22:31:23 · 5085 阅读 · 0 评论 -
Android音视频之Rtmp推流到B站(手机直播demo)
学习目标:Android音视频之Rtmp推流到B站学习内容:rtmp推流实现通过rtmpdump的方式实现rtmp推流,选择以android结尾的下载,即(librtmp)rtmpdump下载地址录屏功能的实现通过线程的方式实现不断的读取录屏数据,并且利用rtmpdump实现推流。public class VideoCodec extends Thread { private ScreenLive screenLive; //MediaCodec是Android提供的用原创 2021-07-18 22:37:24 · 1957 阅读 · 3 评论 -
Android音视频之不同设备之间的视频通话(webSocket)
学习目标:Android音视频之不同设备之间的视频通话(webSocket),实现局域网内的视频通话(建议使用Android6.0及以上的设备)学习内容:注意点:手机的摄像头其实歪的,我们需要通过旋转的方式将画面进行旋转,你有会问?为什么相册里的照片都是正的,那是因为Android系统在拍照的时候就帮你做了处理了。摄像头捕捉到的数据是NV21,在网络传输的时候我们转成了NV12进行网络传输视频流的时候,一定要带每个I帧前面拼上sps和pps首先我们既然要实现通话,我们就需要先实现本地的视原创 2021-07-18 21:04:10 · 2236 阅读 · 1 评论 -
H264推流拉流实现(硬编解码)
学习目标:H264推流拉流实现(硬编解码)学习内容:当前实现的是在区域网内的H264编解码,在启动的时候我们需要先启动推流端(服务端),然后再启动拉流端(客户端)。本例采用的是webSocket的方式实现的手机投屏到另一个手机的功能,接下来上代码。推流端推流端项目代码链接推流端的代码主要实现方式就是通过录屏将数据通过MediaCodec编码成H264编码推送出去。下面就是推流的时候关键代码,具体代码请看上面项目链接。//处理并且发送录屏的数据 private void dealFr原创 2021-07-13 23:31:21 · 1492 阅读 · 0 评论 -
H265编码 SPS分析
学习目标:H265编码分析学习内容:H265出现的原因:我们视频的分辨率 从 720p到1080p,而且电视的屏幕也越来越大视频帧率从30帧 到60帧,再到120帧这就会导致我们cpu在编解码的时候,会出现宏块个数爆发式增长,运动矢量复杂度增加的后果,直接导致我们编码后的视频文件依旧很大,所以H264编码方式已经不满足现在的需求了,H265也就应运而生。下面是通过Elecard HEVCAnalyzer 软件分析宏块的效果,可以看到我们的宏块大小在颜色差异大的地方越小,这样我们的画原创 2021-07-13 21:42:02 · 3676 阅读 · 2 评论 -
Js与webView交互
学习目标:Js与webView交互学习内容:首先,第一步,我们需要先定义一些android的原生方法public class Android { SharedPreferences sp; @JavascriptInterface public void save(String username, String password) { sp = Application.getInstance().getSharedPreferences("SHARE原创 2021-07-09 23:00:19 · 788 阅读 · 2 评论 -
Android音视频视频基础(H264)二 SPS分析
学习目标:SPS分析与读取学习内容:首先肯定得截个sps数据的图来看分析了。上图红框内就是sps数据了。67是sps标识,不清楚的小伙伴可以阅读下面的博客Android音视频视频基础(H264)接下来我们把数据都一对一的转成二进制,这里就不全部写下来了。十六进制二进制670110 0111640110 0100000000 0000150001 0101AC1010 1100D91101 100141原创 2021-06-25 22:40:55 · 440 阅读 · 1 评论 -
android 音视频 mediaCodec解析视频
学习目标:android 音视频 mediaCodec解析视频学习内容:我们解析视频的时候我们可以使用android 提供的apiMediaPlayer,实现简单的播放暂停,但是当我们需要提取视频中的一帧或者编辑视频,就很难实现了,所以我们需要另一个apiMediaCodec(硬解,控制DSP芯片)或者 ffmpeg(软解,耗时),我们选择的优先级一定要硬解大于软解。从上图我们可以知道,左边是输入数据有几个空的buff是给我们放我们传过来的数据的(YUV),右边则是DSP芯片编码出来的数据。注原创 2021-06-19 21:34:47 · 402 阅读 · 2 评论 -
Android音视频视频基础(H264)
学习目标:Android音视频学习内容:大致思路:一般视频文件里不光有视频,还有音频(而且视频和音频的轨道可以有多个,没有限制。),封装格式的作用就是把视频和音频打包起来。 所以我们先要了解解封装格式,然后有哪些视频编码和哪些 音频编码,此时的音频流和视频流都还是压缩数据,不能直接用于显示,所以最后就需要解码封裝格式封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。 下面是几原创 2021-06-18 20:27:25 · 582 阅读 · 2 评论 -
cmake编译学习
学习目标:cmake编译流程学习内容:gardle 中配置cmake默认情况下,cmake 会输出 4 种 ABI(“armeabi-v7a” , “arm64-v8a”, “x86”, “x86_64”),如下所示:我们可以在其中任意一个版本下会找到,build_command.txt,这个就是构建命令txt//cmake的可执行文件在那个路径 (绝对路径)Executable : D:\AndroidStudio\sdk\cmake\3.10.2.4988404\bin\cmake.原创 2021-06-14 22:32:40 · 446 阅读 · 0 评论 -
JNI 编程学习知识点记录
学习目标:JNI 编程学习学习内容:JNI中定义关键字的别名原创 2021-06-14 00:41:42 · 1663 阅读 · 5 评论 -
学习篇---NDKGIF-MASTR(github项目注释)
学习目标:NDKGIF-MASTR(github项目注释)ps:这个项目是别人的,不是博主的,博主只是做个阅读,做了些注释,要是有问题话,欢迎留言。此次学习github的项目链接此次学习项目有注释后链接学习内容:类名作用giflibgif解析库GifJni.cppJava层调用此类GifPlayer.cppgif解析核心类Pthread.cpp控制当前线程休眠与唤醒SyncTime.cpp时间同步计算类log.h日志类GifJn原创 2021-06-12 22:38:01 · 198 阅读 · 1 评论 -
NDK之加载89a版本的gif
学习目标:NDK之加载89a版本的gif学习内容:gif的版本有87a,89a这两种不同的编码方法,所以解码方式也有所不同。想知道你是什么版本的gif?简单右键图片 ,文本打开,然后看下图那今天先手敲一个89a(现在都是89a了) 既然是从NDK的方向入手,当然得先创建一个Native工程,目录如下所示cpp文件夹目录下,没有被框起来的是gifLib库,你会问这些哪里来的?我告诉你,在下面,把里面的C/C++文件c v里面的代码都是google工程师的产出,至于代码我就不看了,比较原创 2021-06-08 20:30:43 · 572 阅读 · 1 评论 -
Handler原理解析
学习目标:Handler原理解析学习内容:名称作用Message消息的载体,携带具体数据MessageQueue一系列Message的容器Looper内部对MessageQueue进行无限循环,有消息就取出交给Handler处理,没消息就阻塞 private Handler handler = new Handler(){ @Override public void handleMessage(@NonNull Messa原创 2021-03-19 21:09:29 · 149 阅读 · 0 评论 -
Android中的内存分布和泄漏
学习目标:Android中的内存分布和泄漏学习内容:1.内存模型与分布下面介绍来自Android内存优化实践方法区加载的类信息,常量,静态变量,及时编译器编译后的代码等数据。内存优化时这一部分主要考虑是不是加载了很多不必要的第三方库。这部分的内存减少主要是常量池的回收和类的卸载(类卸载条件:无引用,类加载器可卸载)堆所有的对象都在这个区域产生,该区域属于线程共享的区域,所以写代码时更要注意多线程安全。这个内存区域的大小变化主要是对象的创建和回收,比如:如果短时间内有大量的对象创建和回原创 2021-03-19 01:41:47 · 125 阅读 · 0 评论 -
JetPack之Paging使用
学习目标:JetPack之Paging使用学习内容:AndroidPaging使用官方文档含义:两个字 : 分页加载Paging 三大核心DataSource数据源。数据存放地。PageList存放每一页的数据的集合。每请求一页都会加载到这个集合里面。PageListAdapter与RecyclerView的Adapter差不多。不过我们在使用分页的功能时要继承(extends)PagedListAdapter.引入Paging//paging 核心库im原创 2021-03-16 23:53:43 · 225 阅读 · 0 评论 -
JetPack之WorkManager使用
学习目标:JetPack之WorkManager使用标学习内容:workManager旨在用于延迟运行并且再应用退出或设备重启必须能够可靠运行的任务。引入配置implementation 'androidx.work:work-runtime:2.3.4'三大概念Worker我们要执行的具体任务。需要继承Worker,重写doWork方法,然后在里面写具体的逻辑。WorkRequest上面的Worker是定义了我们要在后台的任务,而这个类是对Worker的包装。下面两个都是继承了原创 2021-03-15 21:40:29 · 310 阅读 · 0 评论 -
JetPack轻量级数据库Room使用和原理解析
学习目标:JetPack轻量级数据库Room原理解析学习内容:简单介绍Room是一个轻量级orm数据库,是对SQLite的再封装,使用起来比SQLite更加简单, 通过注解的方式标记相关功能,编译时自动生成响应的实现类(Impl)。...原创 2021-03-08 20:18:49 · 665 阅读 · 0 评论 -
JetPack之Navigation源码解析以及fragment在Navigation的使用优化
学习目标:JetPack之Navigation源码解析以及fragment在Navigation的使用优化学习内容:从源码的角度分析根据上一篇 JetPack之Navigation与Fragment使用,可以了解到NavHostFragment是托管我们所有的fragment的容器,public class NavHostFragment extends Fragment implements NavHost { ........ @CallSuper @Override原创 2021-03-07 01:16:49 · 165 阅读 · 0 评论 -
JetPack之Navigation与Fragment使用
学习目标:JetPack之Navigation与Fragment学习内容:Navigation三大核心概念导航图在一个集中位置包含所有导航相关信息的XML资源,这包括应用内所有单个区域内容(可以配置携带参数以及用户可以通过应用获取的可能路径)NavHost显示导航图中目标的空白容器,导航组件包含一个默认NavHost实现(NavHostFragment),可显示Fragment目标。NavController在NavHost中管理应用导航的对象。当用户在整个应用中移动时,原创 2021-03-06 00:16:25 · 734 阅读 · 0 评论 -
JetPack之ViewModel使用和原理浅析与DataBinding双向绑定
学习目标:JetPack之ViewModel与DataBinding双向绑定的解密学习内容:ViewModel首先肯定是了解一下的它的作用,没有什么比它的官网解释的更详细的了ViewModel的链接它的主要作用是:ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存(在横竖屏切换时,可以保留数据),在actvity的onDestroy时/Fragment的onDetach时就会clear。先引入implementation 'androidx.lifecycle:lifec原创 2021-02-28 18:00:45 · 974 阅读 · 0 评论 -
LiveData原理解析和仿写一个LiveDataBus
引入LiveData:implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0"学习内容://这个实际上还是继承了LiveDatapublic class MutableLiveData<T> extends LiveData<T> { @Override public void postValue(T value) { super.postValue(value); }原创 2021-02-27 01:47:04 · 211 阅读 · 0 评论 -
自定义view之地图
学习目标:自定义view之中国地图点击边框加粗选中,弹出城市名字,重复点击会取消选中。实现效果:项目链接学习内容:SVG图片在android中我们为了使图片能在多个屏幕上适配,不被拉伸会使用SVG的图片。SVG也可以用来做路径动画,我这里就不讲了,以后有空出一个demo。我们的SVG我们用AndroidStudio打开会出现下面的代码<vector xmlns:android="http://schemas.android.com/apk/res/android"原创 2021-02-26 01:27:14 · 294 阅读 · 0 评论 -
OnCreate()里的xml解析和UI绘制(UI绘制流程)
学习目标:OnCreate()里的xml解析和UI绘制本文接上一篇文章:Activity启动流程(Application->Activity)知识储备:学习内容:OnCreate()里的xml解析在onCreate()方法里都会有这段代码,这里就就是加载布局xml的地方,接下来我们从源码的角度来分析,程序到底是怎么实现加载xml的。public class MainActivity extends Activity { @Override protected void onC原创 2021-02-23 00:24:41 · 618 阅读 · 2 评论 -
Activity启动流程(Application->Activity)
学习目标:ps:注释还是要看的哈!换一个角度解析Activity启动流程之前我写过一篇从另一个角度查看activity的启动流程(从startActivity()入手),要是这篇没看懂,可以查看那篇文章,链接如下 带着你解读Android10.0启动流程源码.学习内容:首先问这样一个问题?你们认为APP启动有main方法吗?有的,绝对有main方法,只是google封装的很好,接下来就来我就带你找找。其实你可以在ActivityThread发现这个main()方法。//Activity原创 2021-02-22 00:28:42 · 908 阅读 · 2 评论 -
AspectJX打造权限申请框架
AspectJ打造权限申请框架原创 2021-02-15 20:28:20 · 294 阅读 · 0 评论 -
仿网易启动页
文章目录APP启动的时候干了啥呢?知识储备二、实现步骤1.新建一个SplashActivity2.配置AndroidManifest3.配置Theme4.splash_preview.xml效果APP启动的时候干了啥呢?用户的角度: 当用户点击APP时,虚拟机并不是马上启动APP,而是会先启动一个白色的窗口,这是为了向用户表示系统已经知道用户点击了APP,这样就可以让用户有一个感知,当APP准备好时,就会把之前的白色窗口关掉。(这里就是会出现白屏的原因,假如你在启动的时候做了很多的操作,就会导致启动原创 2021-02-06 21:38:15 · 105 阅读 · 0 评论 -
手写RecyclerView
文章目录前言一、RecyelerView哪里比较厉害?二、代码说明1.ViewHolder2.RecycledViewPool3.Adapter4.RecyclerView展示前言平时Android开发少不了与RecyclerView打交道,所以对立面的原理也很好奇,是怎么实现的?这篇文章就不讲它的原理了,毕竟大佬很多,我一介平民不敢造次,本文章就旨在简易实现一个自己的recyclerView,加深自己对recyclerView的了解。一、RecyelerView哪里比较厉害?核心思想: 有限加原创 2021-02-06 19:56:49 · 343 阅读 · 0 评论 -
MMKV 基于 mmap 的高性能通用 key-value 组件
MMKV 基于 mmap 的高性能通用 key-value 组件原创 2021-01-29 21:57:39 · 227 阅读 · 0 评论 -
手写简单HashMap
手写简单HashMap原创 2021-01-29 21:41:52 · 333 阅读 · 0 评论 -
内存抖动是什么?怎么解决?内存溢出是什么?怎么解决?垃圾回收机制是什么样的?
1. JVM内存泄漏与内存溢出的区别? 2. 内存抖动是什么?怎么解决? 3. 垃圾回收机制是什么样的?原创 2021-01-23 00:19:55 · 3882 阅读 · 0 评论 -
Android里的虚拟机
一、虚拟机(jvm)是什么?二、jvm和Android虚拟机总结1.1.1Jvm,Dalvik与Art三者之间的区别1.2.1那dex和class到底在结构上的区别1.4.1 Android虚拟机中寄存器起什么作用,与栈的区别在哪里(又或者基于栈与基于寄存器的架构,谁更快?)1.5.1Arm指令究竟是什么指令,与字节码指令的区别1.6.1为什么Art虚拟机比Dalvik虚拟机运行速度高原创 2021-01-14 23:45:08 · 2450 阅读 · 0 评论 -
Android事件传递
学习目标:Android事件传递原创 2021-01-10 22:00:46 · 424 阅读 · 0 评论 -
Glide源码解析
学习目标:Glide源码解析学习内容:1.首先我们先看一下三个问题?Glide的生命周期怎么实现的?缓存,内存,硬盘缓存?这里面会有网络访问请求队列?我们肯定依旧是从使用的角度入手,我们平时都是按照以下的方式使用Glide的。//一般情况下都是这么使用 Glide.with(this).load(url).into(image); //以上的步骤分解1. RequestManager with = Glide.with(this);2. RequestBuilder原创 2021-01-09 23:47:13 · 149 阅读 · 2 评论 -
okHttp源码解析
okHttp源码解析原创 2021-01-07 23:18:30 · 129 阅读 · 0 评论 -
Android 实现自己的组件化开发
Android 实现自己的组件化开发原创 2020-12-30 19:58:23 · 409 阅读 · 2 评论 -
实现一个通过对象映射到Android数据库框架
实现一个通过对象映射到Android数据库框架原创 2020-12-27 19:52:44 · 246 阅读 · 0 评论 -
Android编译时技术,仿照ButterKnife,实现自己的自动注入框架
Android编译时技术,仿照ButterKnife,实现自己的自动注入框架原创 2020-12-27 01:01:36 · 289 阅读 · 0 评论 -
源码解析SharedPreferences你不知道的缺点
源码解析SharedPreferences你不知道的缺点原创 2020-12-24 00:24:14 · 169 阅读 · 0 评论