主页

基于深度优先的图片联通域算法

需求 产品这边需要我能够根据用户画笔轨迹来生成Rect,比如用户在Mask上绘制了3笔,那就是3个区域,但是如果增加一画将3根轨迹连接起来那就是1个区域,如果用橡皮擦断一分为二,那就是2个区域 这个需求一开始听起来感觉挺简单的,和遍历位图之类的没差,后面才发现有点难做,第一个方案采用二遍扫描法,第一遍扫出所有的轨迹起点,第二遍根据起点进行扫描计算出多个Rect 但是两边扫描法耗时太久了,我也不知道我有没有写对,反正扫出来要遍历图片一千多次,我的天这谁能接受啊 方案 经过和iOS端同事的探讨,以及结合GPT,最终得出了这种情况下使用洪水填充算法最佳,洪水填充也是深度优先搜索(DFS)搜索算法的一种应用 代码 #include <jni.h> #include &...

阅读更多

2023年度总结

好快啊,2023就要过去了 今年是我出来正式参加工作的第一年,也着实是狠狠体验了深圳这个全中国加班最严重的城市 今年学了挺多东西,下面总结一下 音视频方面,ffmpeg我现在已经可以称得上是熟练应用了,但是也没深究过其底层的编码器实现,我感觉是挺深奥的 MediaCodec 这东西是很好用,但是写帧如果要加一些特效确实是不太方便,目前只掌握了对Surface,texture等View进行录制的操作 今年也有接触到一些要用NDK来实现的业务,但是做的都比较浅显吧,我希望明年还是能够多接触一些有深度的内容 Compose 这个是我今年比较重点学习的内容,目前已经能够做到想要的效果了,但是没有做过Compose手势交互相关的内容,我感觉和原生View差不多 今年A...

阅读更多

Compose+Navigation,现代化的Android路由方式

闲话 说实话,我真的受够了Android传统开发中的页面跳转传参,Activity跳转Activity,Fragment跳转Fragment,各种不同层级的页面相互跳转,有的时候需要上一级页面的相关数据来上报埋点,有的时候需要上报的埋点数据甚至需要传递五层,加上代码中写死的String Key,我的天哪,看起来就像是地狱一样,最近我打算从0开始开发一个视频剪辑的APP,打算用Compose来进行简单的页面搭建,用原生方法进行复杂以及需要高性能的页面搭建 Navigation以前就知道了,是Google想要倡导单Activity,Navigation控制Fragment的一个库(虽然Google自己的官方Demo也没遵守这一点),这个东西在传统View时期还是挺有局限性的,但是当我将...

阅读更多

GradleDSL,使用build-logic来管理项目

序言 随着项目越来越庞大,为了更好的解耦代码,肯定会需要将不同的UI,功能,抽离为模块,一些大公司会将模块抽的非常细致,一来是为了防止过度耦合带来的难以维护,二来是为了简化Build时间,一个功能编译一个功能的Model即可,而不需要全量编译,Android的模块化开发与相关的模块管理是成为资深Android开发的必修课,笔者在现在并没有可以称得上是资深的技术能力,但是该篇文章也仅仅是我对与Gradle的一些自己的看法 该篇文章中的流程是我按照官方模板项目 Now in Android 来进行分析的 KotlinDSL DSL即domain-specific language是在特定场景下的开发语言,与之对应的是通用开发语言 在我接触的很多项目中,都是采用Groovy来进行开...

阅读更多

AndroidJitPack将编写好的库发布为远程依赖

发布流程 仓库地址 特别感谢 感谢Youtuber @Mikes-Code 制作的视频 Publish Your Android Library (AAR) to JitPack.io Repository | Android Studio 代码与库配置 在AndroidStudio创建一个新项目,这个项目需要包含所需发布到JitPack的功能实现库 我这个项目的结构如图下所示 我们需要发布的库是该项目下的ffmpeg-kit-android-lib,这是一个基于FFmpegKit二次编译满足我的需求的库 该库已经发布在github上,地址为ffmpeg-kit-android-lib 在该库中,我们仅需配置一个jitpack.yml文件,而这个yml文件中仅...

阅读更多

常用命令,配置

常用命令,配置 Git 配置代理 git config --global https.proxy http://127.0.0.1:10808 git config --global https.proxy https://127.0.0.1:10808 取消代理 git config --global --unset http.proxy git config --global --unset https.proxy Linux 端口号//查看端口占用 netstat -anp |grep 杀进程 kill -9 pid v2ray安装脚本 w...

阅读更多

记录一次ffmpeg-kit的本机编译

项目地址 ffmepg-kit是一个适用于移动端的ffmpeg框架 环境 本次编译采用的虚拟机进行,系统是Ubuntu 22.0.4 在编译之前首先需要安装open-jdk环境,这里采用的是17 sudo apt install openjdk-17-jdk 之后需要安装各做所需的环境,按照ffmpeg-kit的文档 autoconf automake libtool pkg-config curl cmake gcc gperf texinfo yasm nasm bison autogen git wget autopoint meson ninja 注意,这里的ninja在Ubunut下叫ninja-build,使用ninja-build包名可以安装成功 接...

阅读更多

短视频场景的简单实现

起因 在某些业务场景下,可能会有刷短视频的需求,方便用户看到各式各样的效果,方便触达到用户,好处都不多说,第一个想到短视频这种产品形态的人简直就是天才 在我参与开发的某个项目的发展阶段,当然也碰到了要做这种竖屏短视频的需求,项目是做比较火的SD图片处理的,当然也涉及到一些视频生成的功能,有不同的视频模板提供个用户观看并选择. 在该场景中,需求是要求做有限刷新的视频流,当然其实要做无限刷新的也挺简单 两种方法,一种是intMaxValue,一种是54123这两种方法孰优孰劣本文就不过多赘述了,本文是阐述如何进行视频播放的相关实现的 实现方案阐述 整体架构采用ViewPager2嵌套item实现,没有采用ViewPager2嵌套Fragment,item封装了不同的状态,断网,加...

阅读更多