- 博客(31)
- 收藏
- 关注
原创 基于WebRTC实现音视频通话
就是开启交换的起点,交换的开启者应该是先进房间的人发起的,如果是一个多人的房间则新进来的人是没有建立连接的对象,其他已经在房间里建立连接的人都需要主动和他建立连接请求。发起方开启视频预览,关联相机画面到,本地的视屏流和音频流开启,在会话创建的时候就应该开启,PeerConnectionFactory是一个很核心关键的类,用于生成各种核心功能对象。进入呼叫界面,点击拒绝或者接受,接受后发送进入房间的消息给服务器,服务器添加用户到房间后发送进入成功的消息给本人,并且发送给所在房间的其他人新人进入的消息。
2024-07-05 16:31:30 1412
原创 Uniapp实战笔记一
JavaScript 中的模块化系统(如 ES6 的模块化)可以提供更好的封装和访问控制,可以使用 export 和 import 关键字来导出和引入模块中的变量、函数和类。
2024-05-24 17:15:40 1112
原创 跨端方案的发展和比较
java借助JVM编译到不同平台?并不是现在说的跨端,现在的跨端通常指使用某一种UI框架或者技术,将一套代码适配到多端。而实际上从业务来说都是前端技术想裂变成其他端的过程,尤其是移动端。上面对主流的跨端方案做了简述,跨端的目的是为了统一,统一的目的是为了更好的服务于业务,实现业务是第一要义。
2024-04-23 20:28:45 1133 2
原创 单片机基础知识扫盲一
计算机系统的三大组成部分:CPU、内部存储器、IO单片机属于计算机的一种CPU是单片机系统的核心部分,别的模块通过总线和CPU进行关联;IO就是芯片的引脚,不同的单片机型号有不同的IO数量和定义;单片机就是一台微型计算机,MCU、单片机、单片微型计算器、微控制器、微控制单元都是一个意思;即常说的PCB ,printed circuit board,印刷电路板;PCB的作用就是骨架和连接。最终目的就是把所有的原件按照正确的电路图连接起来形成一个完整的可以工作的电路。
2023-04-24 16:19:06 876
原创 Android 应用构建 | Gradle基础 & 编写一个插件
Gradle1.定义:![image.png](https://img-blog.csdnimg.cn/img_convert/0d2a0f9e4bb95bfee51849d67c843051.png#clientId=u6849671e-e9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=77&id=u6fdd952a&margin=[object Object]&name=i
2022-05-10 10:23:02 513
原创 通信的基本概念与通信系统的组成
一:通信的基本概念广义上,通信指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法,任意媒介,将信息从一方准确安全的传递到另一方。狭义上,通信就是信息的传输与交换,即信息的传递。## 1.信息系统的层次结构传输—传递—利用物理层次-逻辑层次-系统层次2.通信网络的结构:三类主要设备:传输、交换、终端所有设备按照通信协议的规定协调工作。3.发展1864麦克斯韦预言电磁波的存在;1887赫兹实验证实了电磁波的存在;1896马可尼、波波夫发明无线电通信;1962年,美国发射第一
2022-03-26 22:17:56 10295
原创 设计模式|原型模式
作用和场景对象创建成本过大,同一个类的不同对象之间差别不大,利用已有的对象进行复制,减少创建成本。原型模式属于创建型的设计模式。创建成本过大?对象数据涉及大量计算,排序、哈希计算、io等等。深拷贝与浅拷贝原型模式的实现关键浅拷贝:java语言中的clone()方法就是浅拷贝,他只会拷贝基本数据类型,复制引用对象的内存地址,不会复制对象本身。对于需要方B来说,浅拷贝得到的对象和来源方A是共享的,这就会出现一个问题,相互间的修改会导致来源方数据不统一,比如一次耗时的更新,期望依托临时的散列表B来
2022-03-26 18:43:00 3076
原创 设计模式 | 享元模式
一、作用和场景享元,即共享的单元,该模式的目的是为了,复用对象,节省内存,前提是复用的对象是不可变的对象。关于不可变对象:书中的解释是:对象一旦被创建后,对象所有的状态及属性在生命周期内不会发生任何变化,也就是对象创建后不能进行任何修改,不能改变对象内的成员变量,包括基本数据类型的值,引用类型的变量指向的对象也要具有不可变性public class Object{ private int value; public Object(int value){ this.value = valu
2022-03-14 12:06:15 477
原创 Android | 数据存储整理备忘
存储的类别Android 提供两类物理存储位置:内部存储空间和外部存储空间。在大多数设备上,内部存储空间小于外部存储空间,内部存储是手机系统自带的存储,一般空间都比较小,外部存储一般是SD卡的存储,空间一般都比较大,但不一定可用或者剩余空间可能不足。默认情况下,应用本身存储在内部存储空间中,可以在应用的清单文件中指明偏好设置,以便将应用安装到外部存储空间:<manifest ... android:installLocation="preferExternal"> ...<
2022-03-09 19:07:12 4061
原创 LiveData | observer引起的业务场景BUG
LiveDataLiveData组件是Jetpack新推出基于观察者的消息订阅/分发组件,具有宿主(Activity/Fragment)生命周期感知能力,这种感知能力可确保LiveData仅分发消息给处于活跃状态的观察者,即只有处于活跃状态的观察者才能收到消息。出现的问题业务场景A页面有一个持续性的业务任务,并同时播放BGM,任务的成功失败依赖后端下发的IM消息控制,在业务层则通过LiveData去分发结果问题:A页面跳转到另一个页面B之后,任务仍然执行,BGM任然播放,但停留在页面B的时候,失
2022-01-16 19:05:35 1542
原创 MotionLayout动画使用参考
MotionLayoutConstraintLayout的子类,是一种可以管理应用中的运动和微件动画的布局类型,关联手势和组件动画。支持在XML中完全描述一个复杂的动画。常规使用依赖implementation ‘androidx.constraintlayout:constraintlayout:2.0.0-rc1’布局<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://s
2021-12-25 16:23:23 1529
原创 设计模式一
文章目录前言一、设计模式的分类二、设计模式的拙见三、六大原则1.开闭原则2.依赖倒转3.里氏替换总结前言设计模式对于代码结构很有帮助,想提高代码逼格就绕不过设计模式,所以有必要整理一波。一、设计模式的分类从应用场景上设计模式的分类:很多都是常见的,在使用的开源框架中或者原生代码中都有用到,比如:责任链在网络框架Okhttp中拦截器的使用,java中提供了观察者相关的类可以直接使用,RxJava也是基于观察者模式,甚至LiveData也算是观察者模式,工厂模式也经常看到比如BitmapF.
2021-11-21 22:20:24 1830
原创 Android 问题记录大图加载
Android 问题记录大图加载1.场景:列表中动态内容的预览查看功能;2. 异常报错:出现RuntimeException canot draw too large(***kb) bitmap3. 问题分析:使用glide加载网络图片时的报错,对于一些大长图加载可能会出现内存不足的报错,而业务开发时没有做大图加载的相关处理,而ImageView的宽高都是自适应原始高度,所以内存占用过大。比如一个1M的图片,尺寸是3500/2500,一个像素占4个字节:内存为 350025004/1024/
2021-11-14 18:28:19 1429
原创 Android实现自定义密码输入框
一、实现效果及方案预期效果图:如上图所示,要实现一个这种密码输入框的样式,原生并未提供类似的效果,所以需要自定义控件的方式实现。预期的基础效果:只接受数字;支持输入加密显示;支持删除;密码位数可配置;文字大小、颜色、数字框背景可配置;方案分析:需要解决的问题:配置性;输入、删除如何实现?整体UI如何实现?1.对于输入删除可以通过setOnKeyListener监听软件盘的事件。2.可配置性数据可以通过自定义的属性文件配置;3.对于UI效果:A:可以基于原生控件做开发,每一
2021-11-07 10:40:25 6487 3
原创 Android优化工具及常用方法
Android优化工具及常用方法前言一、优化方向二、常用工具SystraceLayout InspectorCloneographerStrictModeProfile总结前言大部分的时间都在做业务开发,优化方面的工作其实相对占比较少,但也总会出现一些莫名其妙的问题,比如卡顿丢帧,必要的优化方法和工具还是要了解的。此处只做一下备忘和记录,至于具体深层次的使用网上有大佬写的已经很详细了,推荐极客时间张绍文的Android开发高手课程,里面对性能优化做了很明确的引导,但有些难度,追求深度的话可以研究,但文
2021-08-20 17:36:19 403
原创 Kotlin | DSL
这里写目录标题KotlinDSL篇(一)前言一、What's the DSL?二、使用步骤1.引入库2.读入数据总结二、使用步骤1.引入库2.读入数据总结三级目录KotlinDSL篇(一)提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录KotlinDSL篇(一)前言一、What's the DSL?二、使用步骤1.引入库2.读入数据总结二、使用步骤
2021-07-24 16:36:32 2524 3
原创 FFempeg绘制视频
从开始的解封装,初始化解码器,解码,接受,所有的东西都看不到实际的效果,接下来就是展示视频音频的步骤了。一:音频的重采样 在数据接受后判断音频流还是视频流,在音频流中做处理 SwrContext *actx=swr_alloc(); //2p:通道格式默认 声道数 3p:输出格式 actx = swr_alloc_set_opts(actx, av_get_default_channel_layout(2), AV_SAMPLE_FMT_S16,ac->
2020-12-26 18:23:16 210
原创 FFmpeg方法记录
AVPacket:.AVBufferRef *buf;//引用计数int64_t pts;//pts *(num/den) 显示时间int64_t dts;//解码时间av_packet_alloc(void);创建并初始化 会申请空间需要释放av_packet_clone();创建并并用计数void av_packet_free();清空对象并减少引用计数void av_init_packet();默认值av_seek_frame:(seek操作):int av_seek_frame(
2020-12-17 19:39:35 128
原创 FFmpeg音视频解码及单多线程测试
一:解码器初始化步骤 AVCodec *codec = avcodec_find_decoder(ic->streams[videoStream]->codecpar->codec_id); AVCodecContext *vc = avcodec_alloc_context3(codec) avcodec_parameters_to_context(vc,ic->streams[videoStream]->codecpar) vc->
2020-12-17 19:37:27 1241
原创 FFmpeg引入项目
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言二、使用步骤前言之前已经将ffmpeg源码交叉编译完成,下面主要在Android studio中创建项目使用# 一、项目中使用 创建项目,项目目录下图所示,将编译好的ffmpeg文件拷贝到app目录下: ![项目目录](https://img-blog.csdnimg.cn/20201206210035295.png?x-oss-process=image/watermark,type_ZmFuZ3
2020-12-07 22:30:59 513
原创 FFmpeg交叉编译、脚本参数配置
一:下载ffmpeg源码到/root/ff目录使用git下载的话先安装git(https://github.com/FFmpeg/FFmpeg.git):或者使用wget直接下载相应的版本:官网地址https://ffmpeg.org/download.html#releaseshttps://ffmpeg.org/releases/ffmpeg-3.4.tar.bz2因为之前已经配置共享目录,也可以直接把windows中下载好的直接拷贝过去。这时去查看ff目录下文件:执行 tar -xvf
2020-12-06 17:19:27 592
原创 Ubuntu常用工具安装并配置samba共享
一:## 详细步骤1 网盘下载:https://pan.baidu.com/s/1o92PAZ4#list/path=%2F2涉及到的一些Linux命令:https://blog.csdn.net/luansj/article/details/972726723下载ubantu:https://cn.ubuntu.com/download/thank-you?version=20.04&architecture=amd64计划用来做交叉编译所以下载server版不需要桌面版下载VMware
2020-12-05 22:22:57 202
原创 Android启动模式选用存在的问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言出现的问题二、使用步骤1.引入库2.读入数据总结前言 当前迭代的项目Muza在1.48版本中加入一对一视频通话的功能,场景与微信视频通话类似,在私信界面发起方发起进入视频界面,接收方收到视频邀请进入视频,接收方接受后开始通话。功能的搭建基于声网的SDK,但在开发测试环节出现了启动模式相关的问题。出现的问题对于双方视屏交互界面的Activity,考虑到要做退出小窗悬浮,以及视屏功能对于整个APP来说同一时刻唯
2020-12-03 21:04:19 214
原创 Android结构模式的主要区别(MVC)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、MVC简述MVC总结前言Android中的项目结构主要有MVC,MVP,MVVM,原始级别的MVC演变出来后两种,每种模式都各有优缺点,每一种模式的目的都是为了让业务逻辑更清晰,代码分离降低耦合度,方便长期的快捷维护,由于现在公司的项目比较old,还是原始的MVC模式,部分业务使用MVP模式,由于快速的迭代业务,部分代码甚至已经脱离模式,所以有必要重新整理下;一、MVC简述1.MVC(Model--View--Co
2020-10-27 22:59:36 327
原创 简述Java中的注解
Java中的注解 一.注解(Annotation): 1.解释:其实就是代码的特殊标记,这些标记可以在编译、运行时、类加载时被读取,并执行相应的操作。 2.代码中常常出现的注解,java提供的基本注解:@Override、@Deprecated、@SuppressWarnings、@SafeVarargs、@FunctionalInterface。其中ov是最常见用来指定方法的覆盖,强制一些子类必须覆盖父类的一些方法,编译器会检查是否重写,避免类名写错等低级的错误。Depreca
2020-06-21 12:46:59 209
原创 关于内存的小结
关于内存:一:OOM原因分析项目OOM设备信息截图:8.0系统以下发生OOM的频率较高。Bitmap图片是造成OOM的主要原因。应用程序的内存分配和垃圾回收都是由Android虚拟机完成的,在Android 5.0以下,使用的是Dalvik虚拟机,5.0及以上,则使用的是ART虚拟机。系统变更Bitmap在内存中分配位置的变化:1.Android 3.0之前是存放在Java堆内存中,像素数据存储在Native heap中,如果不手动调用 recycle,Bitmap Native 内存的回收
2020-06-01 17:45:07 170
原创 Android中的ActivityThread和ApplicationThread
一:ActivityThread和ApplicationThread1.ActivityThread:主线程、UI线程,程序的入口(main函数),不是线程是运行在主线程中的一个对象主要的成员变量如下: mActivities、mServices和mProviderMap 这三个变量保存了应用中所有的对应组件(相对生命周期长的,BroadcastReceiver生命周期很短暂);main方法中:public static void More …main(String[] args) {
2020-06-01 17:34:47 2462
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人