<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[JohanMan的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/JohanMan</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; JohanMan]]></copyright><item><title><![CDATA[Android开发学习Framework之路-目录]]></title><link>https://blog.csdn.net/JohanMan/article/details/140577128</link><guid>https://blog.csdn.net/JohanMan/article/details/140577128</guid><author>JohanMan</author><pubDate>Sat, 20 Jul 2024 21:11:39 +0800</pubDate><description><![CDATA[Android系统Framework相关知识学习了很长时间，一直处于学了忘，忘了学的状态，主要原因还是没有学透，没有完全理解，而且学到的原理也暂时没用上，毕竟目前工作做的是APP开发。毕竟好记性不如烂笔头，决定还是以博客的形式来记录学习到的知识，也能更好的梳理相关逻辑。由于Android系统Framework的知识非常多，会有很多篇博客，这篇博客主要作为目录的作用，方便查看阅读。]]></description><category></category></item><item><title><![CDATA[SystemServer分析记录]]></title><link>https://blog.csdn.net/JohanMan/article/details/131372767</link><guid>https://blog.csdn.net/JohanMan/article/details/131372767</guid><author>JohanMan</author><pubDate>Sun, 25 Jun 2023 10:50:51 +0800</pubDate><description><![CDATA[Zygote进程forkSystemServer进程后，调用了SystemServer的main方法，具体流程请参考其他资料，这里记录的是SystemServer关键代码的分析。]]></description><category></category></item><item><title><![CDATA[epoll使用实例]]></title><link>https://blog.csdn.net/JohanMan/article/details/126386778</link><guid>https://blog.csdn.net/JohanMan/article/details/126386778</guid><author>JohanMan</author><pubDate>Wed, 17 Aug 2022 15:38:23 +0800</pubDate><description><![CDATA[Android的Looper机制中，MessageQueue阻塞的方式是通过Linux的epoll机制，IO多路复用机制，这里不说原理，说一下epoll使用机制，还是参数的解析。]]></description><category></category></item><item><title><![CDATA[FFmpeg 命令集合]]></title><link>https://blog.csdn.net/JohanMan/article/details/122885169</link><guid>https://blog.csdn.net/JohanMan/article/details/122885169</guid><author>JohanMan</author><pubDate>Fri, 11 Feb 2022 17:24:28 +0800</pubDate><description><![CDATA[因为经常会使用FFmpeg命令对视频做处理，所以在这里记录一下常用的命令


ffmpeg -i a.mov -strict -2 -vf crop=1080:1080:0:420 out.mp4


其中的 crop=1080:1080:0:420 才裁剪参数，具体含义是 crop=width:height❌y，其中 width 和 height 表示裁剪后的尺寸，x:y 表示裁剪区域的左上角坐标。


...]]></description><category></category></item><item><title><![CDATA[Docker基本使用]]></title><link>https://blog.csdn.net/JohanMan/article/details/120973736</link><guid>https://blog.csdn.net/JohanMan/article/details/120973736</guid><author>JohanMan</author><pubDate>Tue, 26 Oct 2021 16:01:53 +0800</pubDate><description><![CDATA[安装docker
1.检查卸载以前的版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docke]]></description><category></category></item><item><title><![CDATA[Spring AMQP 笔记]]></title><link>https://blog.csdn.net/JohanMan/article/details/120973301</link><guid>https://blog.csdn.net/JohanMan/article/details/120973301</guid><author>JohanMan</author><pubDate>Tue, 26 Oct 2021 15:44:10 +0800</pubDate><description><![CDATA[这篇博客是博主学习的笔记，可能说的不是很清楚，也可能会有错误，多担待

AMQP协议
AMQP（Advanced Message Queuing Protocol，高级消息队列协议）是一个进程间传递异步消息的网络协议
概念

Publisher：发布者
Consumer：消费者
Message：消息
Queue：消息队列
Exchange：交换机，把发送的消息按照规则发送到符合规则的消息队列中，起消息路由作用

fanout类型：将消息发送到绑定的所有队列中
direct类型：将消息发送到routeKey.]]></description><category></category></item><item><title><![CDATA[Feign]]></title><link>https://blog.csdn.net/JohanMan/article/details/120718367</link><guid>https://blog.csdn.net/JohanMan/article/details/120718367</guid><author>JohanMan</author><pubDate>Tue, 12 Oct 2021 10:24:40 +0800</pubDate><description><![CDATA[依赖管理
统一依赖版本号
&lt;!--SpringBoot版本号--&gt;
&lt;parent&gt;
	&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
	&lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
	&lt;version&gt;2.4.2&lt;/version&gt;
	&lt;relativePath/&gt; &lt;!-- lookup par]]></description><category></category></item><item><title><![CDATA[Nacos]]></title><link>https://blog.csdn.net/JohanMan/article/details/120708250</link><guid>https://blog.csdn.net/JohanMan/article/details/120708250</guid><author>JohanMan</author><pubDate>Mon, 11 Oct 2021 17:47:19 +0800</pubDate><description><![CDATA[Nacos常用的二大功能：

服务注册和发现
配置中心（可热更新）

Nacos安装
下载地址：https://github.com/alibaba/nacos/releases/tag/2.0.3
下载解压就可以使用
Nacos使用
1.单机启动
单机启动一般用于学习和测试，命令窗口cd到安装目录/nacos/bin，使用命令startup.cmd -m standalone，浏览器访问地址：http://127.0.0.1:8848/nacos/index.html，账号和密码都是nacos。
2.集群]]></description><category></category></item><item><title><![CDATA[Glide源码解读之绑定生命周期]]></title><link>https://blog.csdn.net/JohanMan/article/details/110533218</link><guid>https://blog.csdn.net/JohanMan/article/details/110533218</guid><author>JohanMan</author><pubDate>Thu, 03 Dec 2020 15:42:14 +0800</pubDate><description><![CDATA[今天有空，稍微解读了一下glide加载图片框架源码，glide源码比较多，除了弄清楚主流程，对我编程有帮助的，我都会记录下来。
我这里不会一步一步详细解读源码，因为其他博客一大堆，我这里主要讲解一下原理；
绑定生命周期，不用我们自己在onStart，onStop去调用，这种思想很好，所以，值得借鉴。
主要实现原理是创建一个无UI的Fragment添加（绑定）到当前的Activity（或其他Fragment），通过重写Fragment的onStart和onStop方法，通知RequestManager任务改变]]></description><category></category></item><item><title><![CDATA[PS 一键生成Android各个尺寸的图标]]></title><link>https://blog.csdn.net/JohanMan/article/details/107016316</link><guid>https://blog.csdn.net/JohanMan/article/details/107016316</guid><author>JohanMan</author><pubDate>Mon, 29 Jun 2020 11:29:46 +0800</pubDate><description><![CDATA[之前的项目都是用一套尺寸的图标做适配，优点就是减少APP的大小，还不用做多套适配图标，缺点就是每次加载图标都要做缩放，影响APP的性能。
公司最近终于招到UI了，发现他的PS工具可以一键生成Android和iOS各种尺寸图标。最近新建一个项目，打算尝试自己生成Android各种尺寸图标。

工具
PS
脚本
这个PS脚本是我参照别人写的，直接共享出来：
// 获取当前的文档
var pngDoc = activeDocument;

// 弹出对话框，提示输入文件名
var destName = prom.]]></description><category></category></item><item><title><![CDATA[Android FFmpeg音频重采样]]></title><link>https://blog.csdn.net/JohanMan/article/details/97109917</link><guid>https://blog.csdn.net/JohanMan/article/details/97109917</guid><author>JohanMan</author><pubDate>Wed, 24 Jul 2019 11:40:25 +0800</pubDate><description><![CDATA[自己有个需求，要把采样率为44100的PCM重采样为16000的PCM，经过1天的探索，终于成功了！！
网上的资料比较少，找到的都是比较零碎的知识点，只能慢慢摸索，想到这个，还是觉得有团队好，个人学习总是慢一点的，比较曲折，不过也能锻炼个人的学习能力！
基本原理
进入正题，所谓音频重采样，简单来说，就是在原来的PCM进行插值（低采样率到高采样率）或抽取（高采样率到低采样），但是如果我们只是线性插值...]]></description><category></category></item><item><title><![CDATA[JNI 同一个Module生成多个so]]></title><link>https://blog.csdn.net/JohanMan/article/details/94012742</link><guid>https://blog.csdn.net/JohanMan/article/details/94012742</guid><author>JohanMan</author><pubDate>Fri, 28 Jun 2019 16:47:26 +0800</pubDate><description><![CDATA[终于解决困扰了我2天的问题！！！那叫一个激动！！
最近做一个项目，需要在同一个模块中同时生成两个SO文件，刚开始没觉得怎么样，就在一个CMakeLists.txt文件这么写入：
cmake_minimum_required(VERSION 3.4.1)
# 这是第一个so
add_library(
    a-lib
    SHARED
    a.cpp
)
# 这是第二个so
add_lib...]]></description><category></category></item><item><title><![CDATA[Android 自定义可手势移动、放缩ImageView]]></title><link>https://blog.csdn.net/JohanMan/article/details/93336425</link><guid>https://blog.csdn.net/JohanMan/article/details/93336425</guid><author>JohanMan</author><pubDate>Sat, 22 Jun 2019 16:53:28 +0800</pubDate><description><![CDATA[又很长的一段时间没写博客，趁着空闲之余，做一下一个常用的自定义View的记录。
手势移动、放缩ImageView是一个很常用的控件，之前都是用别人写好的，发现对Matrix类不是很熟悉，估计以后可能会经常用到这个类，所以想深入了解一下Matrix原理和怎么使用！
Matrix
网上太多资料了，比如 Android Matrix矩阵，大家自行查资料，只有理解了Matrix变换矩阵，才能看懂下面的代码...]]></description><category></category></item><item><title><![CDATA[Android JNI操作Bitmap实现黑白图片]]></title><link>https://blog.csdn.net/JohanMan/article/details/84826825</link><guid>https://blog.csdn.net/JohanMan/article/details/84826825</guid><author>JohanMan</author><pubDate>Wed, 05 Dec 2018 11:46:57 +0800</pubDate><description><![CDATA[最近想练习一下NDK，基于我接下来的目标是多媒体，多以想多点学习一下关于滤镜的知识，黑白滤镜是最简单的了。
这里实现的是将一张彩色图片转成黑白图片，是黑白滤镜的基础！
直接上码：
// java 代码
public void gray(View view) {
    Bitmap source = BitmapFactory.decodeResource(getResources(), R.dr...]]></description><category></category></item><item><title><![CDATA[Android FFmpeg系列——7 实现快进/快退功能]]></title><link>https://blog.csdn.net/JohanMan/article/details/83586383</link><guid>https://blog.csdn.net/JohanMan/article/details/83586383</guid><author>JohanMan</author><pubDate>Wed, 31 Oct 2018 16:35:24 +0800</pubDate><description><![CDATA[实现快进、快退功能，其实就是设置视频的播放进度！
基本思路如下：

暂停 生产（读取帧）和 消费（解码播放）；
清空队列，包括视频队列和音频队列；
调用 av_seek_frame 设置进度；
唤醒，继续 生产（读取帧）和 消费（解码播放）；

思路很简单，我们一步一步实现！
暂停 生产（读取帧）和 消费（解码播放）
这里，我结合线程锁和条件变量来实现，暂时生产和消费：
/**
 * 生产函数
 ...]]></description><category></category></item><item><title><![CDATA[Android FFmpeg系列——6 Java 获取播放进度]]></title><link>https://blog.csdn.net/JohanMan/article/details/83583443</link><guid>https://blog.csdn.net/JohanMan/article/details/83583443</guid><author>JohanMan</author><pubDate>Wed, 31 Oct 2018 14:26:08 +0800</pubDate><description><![CDATA[一般播放器都能显示播放进度，这一节来实现这个功能。由于我是在 C 层播放视频的，至于播放到哪里，Java 层是不知道的，所以得利用 C 调用 Java 代码来实现。
Java 代码
/**
 * 同步播放音视频
 * @param path
 * @param surface
 * @param callback
 */
public native void play(String path, S...]]></description><category></category></item><item><title><![CDATA[Android FFmpeg系列——4 子线程播放音视频]]></title><link>https://blog.csdn.net/JohanMan/article/details/83416664</link><guid>https://blog.csdn.net/JohanMan/article/details/83416664</guid><author>JohanMan</author><pubDate>Fri, 26 Oct 2018 16:48:42 +0800</pubDate><description><![CDATA[利用工作闲余时间，终于实现在子线程播放音视频！
上一接学习了在 C 使用多线程，接着就是利用 C 多线程同时播放音视频（暂时还不同步）。
不多说，直接上码。
代码
// C 层播放器结构体
typedef struct _Player {
    // Env
    JavaVM *java_vm;
    // Java 实例
    jobject instance;
    jobject...]]></description><category></category></item><item><title><![CDATA[Android FFmpeg系列——5 音视频同步播放]]></title><link>https://blog.csdn.net/JohanMan/article/details/83176144</link><guid>https://blog.csdn.net/JohanMan/article/details/83176144</guid><author>JohanMan</author><pubDate>Fri, 19 Oct 2018 10:15:45 +0800</pubDate><description><![CDATA[音视频同步播放是做播放器的难点之一，在博主用到的播放器中，有一款播放器我真的无法忍受，那就是百度云播放器！这里我真的得吐槽一下，卡顿之后，然后视频可以正常播放，但是没有声音，声音竟然没了！！你这么一个大厂，连这点都搞不定？！而且我还提过2次建议（因为实在忍不了，但是又必须得用），也不是出现的概率很低，真搞不明白！！好啦，吐槽完了，回归正题，我们来学习怎么实现音视频用不播放！
首先，我们得先了解几个...]]></description><category></category></item><item><title><![CDATA[Android FFmpeg系列——3 C多线程使用]]></title><link>https://blog.csdn.net/JohanMan/article/details/83109147</link><guid>https://blog.csdn.net/JohanMan/article/details/83109147</guid><author>JohanMan</author><pubDate>Thu, 18 Oct 2018 17:39:25 +0800</pubDate><description><![CDATA[在 Android FFmpeg系列——2 播放音频 中，在主线程播放音频会导致ANR，虽然我们可以在 Java 层启动一个线程来播放，由于接下来我们要实现完整播放视频，需要在 C 层达到控制效果，所以我们还是在 C 层启动新线程来播放音频。
这一节，我们来学习 C 层多线程的使用。
pthread
pthread 是 C 语言实现多线程的库，我们要了解这个库的3个相关函数。

pthread_c...]]></description><category></category></item><item><title><![CDATA[Android FFmpeg系列——2 播放音频]]></title><link>https://blog.csdn.net/JohanMan/article/details/83107270</link><guid>https://blog.csdn.net/JohanMan/article/details/83107270</guid><author>JohanMan</author><pubDate>Wed, 17 Oct 2018 11:34:12 +0800</pubDate><description><![CDATA[音频简介
虽然听了很多音频，但其实对音频知之甚少，所以很有必要了解一下音频。
Audio，指人耳可以听到的声音频率在20Hz~20kHz之间的声波，称为音频。
音频录制
播放音频之前，我们得先了解音频是怎么保存的。保存音频，其实也就是录音和制作。
模拟时代
模拟时代是把原始信号以物理方式录制到磁带上（当然在录音棚里完成了），然后加工、剪接、修改，最后录制到磁带、LP等广大听众可以欣赏的载体上。这一...]]></description><category></category></item></channel></rss>