自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

sunlifeall的博客

既然选择了远方,便只顾风雨兼程

  • 博客(58)
  • 资源 (23)
  • 收藏
  • 关注

原创 音频的裁剪、合成、给MP4文件混合背景音频

学习目标:音频的裁剪、合成、小例子学习内容:一、音频的裁剪1.程序思路把一段mp3文件裁剪生成一个新的mp3文件,我们通过对一段视频进行解析出pcm码流,然后输出对应的时间段的pcm视频流,然后在这段视频流前面添加wav头部,生成mp3文件,这样就裁剪完成了。有关添加wav头部的实现请看下面的链接:音频之WAV格式编码解析解析mp3文件代码如下:MediaCodec mediaCodec = null; MediaExtractor mediaExtractor

2021-08-01 15:56:18 643 1

原创 音频之WAV格式编码解析

学习目标:音频之WAV格式编码解析学习内容:介绍WAV是最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。但WAV文件有一个致命的缺点,就是它所占用的磁盘空间太大(每分钟的音乐大约需要12兆磁盘空间)。它符合资源互换文件格式(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。WAV格式名称占用字节数计算公式对应16进制解释

2021-07-28 22:31:23 5365

原创 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 2044 3

原创 Android音视频之不同设备之间的视频通话(webSocket)

学习目标:Android音视频之不同设备之间的视频通话(webSocket),实现局域网内的视频通话(建议使用Android6.0及以上的设备)学习内容:注意点:手机的摄像头其实歪的,我们需要通过旋转的方式将画面进行旋转,你有会问?为什么相册里的照片都是正的,那是因为Android系统在拍照的时候就帮你做了处理了。摄像头捕捉到的数据是NV21,在网络传输的时候我们转成了NV12进行网络传输视频流的时候,一定要带每个I帧前面拼上sps和pps首先我们既然要实现通话,我们就需要先实现本地的视

2021-07-18 21:04:10 2489 1

原创 H264推流拉流实现(硬编解码)

学习目标:H264推流拉流实现(硬编解码)学习内容:当前实现的是在区域网内的H264编解码,在启动的时候我们需要先启动推流端(服务端),然后再启动拉流端(客户端)。本例采用的是webSocket的方式实现的手机投屏到另一个手机的功能,接下来上代码。推流端推流端项目代码链接推流端的代码主要实现方式就是通过录屏将数据通过MediaCodec编码成H264编码推送出去。下面就是推流的时候关键代码,具体代码请看上面项目链接。//处理并且发送录屏的数据 private void dealFr

2021-07-13 23:31:21 1605

原创 H265编码 SPS分析

学习目标:H265编码分析学习内容:H265出现的原因:我们视频的分辨率 从 720p到1080p,而且电视的屏幕也越来越大视频帧率从30帧 到60帧,再到120帧这就会导致我们cpu在编解码的时候,会出现宏块个数爆发式增长,运动矢量复杂度增加的后果,直接导致我们编码后的视频文件依旧很大,所以H264编码方式已经不满足现在的需求了,H265也就应运而生。下面是通过Elecard HEVCAnalyzer 软件分析宏块的效果,可以看到我们的宏块大小在颜色差异大的地方越小,这样我们的画

2021-07-13 21:42:02 3953 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 818 2

原创 Android音视频视频基础(H264)二 SPS分析

学习目标:SPS分析与读取学习内容:首先肯定得截个sps数据的图来看分析了。上图红框内就是sps数据了。67是sps标识,不清楚的小伙伴可以阅读下面的博客Android音视频视频基础(H264)接下来我们把数据都一对一的转成二进制,这里就不全部写下来了。十六进制二进制670110 0111640110 0100000000 0000150001 0101AC1010 1100D91101 100141

2021-06-25 22:40:55 473 1

原创 android 音视频 mediaCodec解析视频

学习目标:android 音视频 mediaCodec解析视频学习内容:我们解析视频的时候我们可以使用android 提供的apiMediaPlayer,实现简单的播放暂停,但是当我们需要提取视频中的一帧或者编辑视频,就很难实现了,所以我们需要另一个apiMediaCodec(硬解,控制DSP芯片)或者 ffmpeg(软解,耗时),我们选择的优先级一定要硬解大于软解。从上图我们可以知道,左边是输入数据有几个空的buff是给我们放我们传过来的数据的(YUV),右边则是DSP芯片编码出来的数据。注

2021-06-19 21:34:47 438 2

原创 Android音视频视频基础(H264)

学习目标:Android音视频学习内容:大致思路:一般视频文件里不光有视频,还有音频(而且视频和音频的轨道可以有多个,没有限制。),封装格式的作用就是把视频和音频打包起来。 所以我们先要了解解封装格式,然后有哪些视频编码和哪些 音频编码,此时的音频流和视频流都还是压缩数据,不能直接用于显示,所以最后就需要解码封裝格式封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。 下面是几

2021-06-18 20:27:25 610 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 489

原创 JNI 编程学习知识点记录

学习目标:JNI 编程学习学习内容:JNI中定义关键字的别名

2021-06-14 00:41:42 1719 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 209 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 598 1

原创 C++学习手记

学习目标:本文主要记录学习C++ 时的需要注意的地方,基础的我就跳过了。学习内容:类C++中类的定义方式跟Java差不多,如下:public: int age; int getAge() const; void setAge(int age); //构造函数 person() { this->age = 0; cout << "init age: 0"<<endl; } per

2021-06-01 20:24:28 96 2

原创 C++“磨人“的词汇

学习目标:C++,从名字可以看出是C的升级版,所以C里有的词汇它都有,我们认识以下C++独有的词汇。 学习内容:名字示例引用int &a = b;引用int &a = b;引用 : 如示例所示 int &a = b;,这跟C语言中的可不一样,这个&它是在=号左边出现的,所以跟C中的不一样,它表示 把a定义为变量b的别名,看例子。int a = 10;int &a1 = a;a1 = 30;cout<&lt

2021-06-01 20:23:57 109 2

原创 C语言的动态开辟一维数组和二维数组

学习目标:C语言的动态开辟一维数组和二维数组学习内容:动态开辟一维数组 int num = 10; //开辟空间 int* num_arr = malloc(num * sizeof(int)); //赋值 for (int i = 0; i < num; ++i) { *(num_arr + i) = i * 2 + 1; } //输出 for (int i = 0; i < num; ++i) { printf("%d\t",num_arr[

2021-05-24 21:44:03 1059

原创 C语言内存分布

学习目标:c语言内存分布学习内容:内存分布如图:代码区:程序被操作系统加载到内存的时候,所有的可执行代码(程序代码指令、常量字符串等)都加载到代码区,这块内存在程序运行期间是不变的。代码区是平行的,里面装的就是一堆指令,在程序运行期间是不能改变的。函数也是代码的一部分,故函数都被放在代码区,包括main函数。静态区:静态区存放程序中所有的全局变量和静态变量。堆区:可以使用除了系统占用内存空间之外的所有空间,malloc、calloc、realloc数用来在堆中分配指定大小的内存,

2021-05-23 15:30:06 510 5

原创 C语言中“磨人“的词汇

编译环境:一切调试结果都是在64位机上调试的基础必备:C语言运算符优先级学习记录:名称含义指针数组int *p[4];数组指针int (*p)[6];指针函数int *p = test();函数指针见解释详情指针常量int * const p;常量指针const int* p ;常指针const int* const p;解释指针数组 : 如示例所示 int*p[4],按照操作符优先级来看,[ ]优先级高于 * ,

2021-05-23 13:37:47 157 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 176

原创 Android中的内存分布和泄漏

学习目标:Android中的内存分布和泄漏学习内容:1.内存模型与分布下面介绍来自Android内存优化实践方法区加载的类信息,常量,静态变量,及时编译器编译后的代码等数据。内存优化时这一部分主要考虑是不是加载了很多不必要的第三方库。这部分的内存减少主要是常量池的回收和类的卸载(类卸载条件:无引用,类加载器可卸载)堆所有的对象都在这个区域产生,该区域属于线程共享的区域,所以写代码时更要注意多线程安全。这个内存区域的大小变化主要是对象的创建和回收,比如:如果短时间内有大量的对象创建和回

2021-03-19 01:41:47 143

原创 JetPack之Paging使用

学习目标:JetPack之Paging使用学习内容:AndroidPaging使用官方文档含义:两个字 : 分页加载Paging 三大核心DataSource数据源。数据存放地。PageList存放每一页的数据的集合。每请求一页都会加载到这个集合里面。PageListAdapter与RecyclerView的Adapter差不多。不过我们在使用分页的功能时要继承(extends)PagedListAdapter.引入Paging//paging 核心库im

2021-03-16 23:53:43 241

原创 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 347

原创 JetPack轻量级数据库Room使用和原理解析

学习目标:JetPack轻量级数据库Room原理解析学习内容:简单介绍Room是一个轻量级orm数据库,是对SQLite的再封装,使用起来比SQLite更加简单, 通过注解的方式标记相关功能,编译时自动生成响应的实现类(Impl)。...

2021-03-08 20:18:49 694

原创 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 183

原创 JetPack之Navigation与Fragment使用

学习目标:JetPack之Navigation与Fragment学习内容:Navigation三大核心概念导航图在一个集中位置包含所有导航相关信息的XML资源,这包括应用内所有单个区域内容(可以配置携带参数以及用户可以通过应用获取的可能路径)NavHost显示导航图中目标的空白容器,导航组件包含一个默认NavHost实现(NavHostFragment),可显示Fragment目标。NavController在NavHost中管理应用导航的对象。当用户在整个应用中移动时,

2021-03-06 00:16:25 768

原创 JetPack之ViewModel使用和原理浅析与DataBinding双向绑定

学习目标:JetPack之ViewModel与DataBinding双向绑定的解密学习内容:ViewModel首先肯定是了解一下的它的作用,没有什么比它的官网解释的更详细的了ViewModel的链接它的主要作用是:ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存(在横竖屏切换时,可以保留数据),在actvity的onDestroy时/Fragment的onDetach时就会clear。先引入implementation 'androidx.lifecycle:lifec

2021-02-28 18:00:45 1027

原创 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 231

原创 自定义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 342

原创 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 634 2

原创 Activity启动流程(Application->Activity)

学习目标:ps:注释还是要看的哈!换一个角度解析Activity启动流程之前我写过一篇从另一个角度查看activity的启动流程(从startActivity()入手),要是这篇没看懂,可以查看那篇文章,链接如下 带着你解读Android10.0启动流程源码.学习内容:首先问这样一个问题?你们认为APP启动有main方法吗?有的,绝对有main方法,只是google封装的很好,接下来就来我就带你找找。其实你可以在ActivityThread发现这个main()方法。//Activity

2021-02-22 00:28:42 963 2

原创 AspectJX打造权限申请框架

AspectJ打造权限申请框架

2021-02-15 20:28:20 311

原创 仿网易启动页

文章目录APP启动的时候干了啥呢?知识储备二、实现步骤1.新建一个SplashActivity2.配置AndroidManifest3.配置Theme4.splash_preview.xml效果APP启动的时候干了啥呢?用户的角度: 当用户点击APP时,虚拟机并不是马上启动APP,而是会先启动一个白色的窗口,这是为了向用户表示系统已经知道用户点击了APP,这样就可以让用户有一个感知,当APP准备好时,就会把之前的白色窗口关掉。(这里就是会出现白屏的原因,假如你在启动的时候做了很多的操作,就会导致启动

2021-02-06 21:38:15 122

原创 手写RecyclerView

文章目录前言一、RecyelerView哪里比较厉害?二、代码说明1.ViewHolder2.RecycledViewPool3.Adapter4.RecyclerView展示前言平时Android开发少不了与RecyclerView打交道,所以对立面的原理也很好奇,是怎么实现的?这篇文章就不讲它的原理了,毕竟大佬很多,我一介平民不敢造次,本文章就旨在简易实现一个自己的recyclerView,加深自己对recyclerView的了解。一、RecyelerView哪里比较厉害?核心思想: 有限加

2021-02-06 19:56:49 360

原创 MMKV 基于 mmap 的高性能通用 key-value 组件

MMKV 基于 mmap 的高性能通用 key-value 组件

2021-01-29 21:57:39 252

原创 手写简单HashMap

手写简单HashMap

2021-01-29 21:41:52 356

原创 内存抖动是什么?怎么解决?内存溢出是什么?怎么解决?垃圾回收机制是什么样的?

1. JVM内存泄漏与内存溢出的区别? 2. 内存抖动是什么?怎么解决? 3. 垃圾回收机制是什么样的?

2021-01-23 00:19:55 4082

原创 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 2550

原创 Android事件传递

学习目标:Android事件传递

2021-01-10 22:00:46 438

原创 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 164 2

MixAudioAndMusic.zip

给一个MP4文件的背景音乐混合mp3音频文件

2021-08-01

mixAudio.zip

mp4文件和mp3文件音频合并

2021-08-01

ClipMusic.zip

裁剪一段MP3音频

2021-08-01

h264&h265.zip

h264&h265官方文档

2021-07-18

RtmpBiliBili.zip

Rtmp流推流

2021-07-18

ChatOnlineApplication.zip

基于webSocket的硬编码实现的视频通话

2021-07-18

MyCamera.zip

摄像头(自动对焦)捕捉画面数据(nv21)转成nv12,并且旋转画面数据90度,保存到本地文件(h264)

2021-07-18

H264ToupinPush.zip

推流端(服务端)

2021-07-13

H264TouPinPlayer.zip

客户端(拉流端)

2021-07-13

H264Decoder.zip

解析视频

2021-06-19

NDKGif-master.zip

android jni (gif 87a&89a 播放器)

2021-06-12

DymaicImageGif.zip

gif 89a版本解析 jni实现

2021-06-08

JetPackNavigation.zip

JetPack之fragment在Navigation的使用优化

2021-03-07

ChinaMap.zip

自定义中国地图view,支持点击选中,弹出城市名字,重复点击会取消选中。

2021-02-26

MyAspectJ.zip

AspectJ实现权限申请

2021-02-15

MyAspectJ.zip

权限申请

2021-02-15

CustomSplash.zip

仿网易启动页

2021-02-06

CustomRecyclerView.zip

自己实现的一个简易recyclerview

2021-02-06

MMKV.zip

用MMKV存hello world navive!

2021-01-10

Componentization.zip

Android 实现自己的组件化开发

2020-12-30

MyDataBase.zip

实现一个通过对象映射到Android数据库框架

2020-12-27

仿照ButterKnife,实现自己的自动注入框架

仿照ButterKnife,实现自己的自动注入框架

2020-12-27

自己实现的Android 三级缓存图片加载框架

自己实现的Android 三级缓存图片加载框架,多线程加载。

2020-12-23

空空如也

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

TA关注的人

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