自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(166)
  • 资源 (3)
  • 收藏
  • 关注

原创 Broadcast入门1

从示例中可以看出,如果仅实现动态注册——监听广播,需要实现的部分如下:1.实现一个receiver,继承自BroadcastReceiver。重写onReceive方法,在里面实现监听到具体广播后的逻辑。2.实例化并注册该receiver,在注册时通过在intentFilter里设置action来指定监听的广播类型。3.在销毁活动时取消注册。否则会导致内存泄漏。该示例展示的是动态注册方法。安卓系统的一些系统级别的广播是要求动态注册的。但是也可以发现动态注册存在的一个问题,就是在程序启动之后才会生效。

2024-04-21 20:36:08 247

原创 Activity入门2——生命周期与任务栈

OnCreate:创建一个活动。OnDestroy:销毁一个活动。假设某个用户在一个活动里输入了一些信息,用户由于某些原因退出了该活动,返回时希望能够还原之前输入的信息,不然重新输入就太麻烦了。从以上代码可以看到:onDestroy:在活动销毁时,将用户输入的内容通过持久化的方式存起来。onCreate:在活动创建时,如果已经有持久化存储的内容,就把该内容取出并赋值到输入栏里。

2024-04-05 15:48:43 262

原创 Activity入门1——activity跳转

显式跳转的特点是,intent中包含要跳转过去的组件的.class。通常用于app内部的跳转。

2024-03-31 22:55:35 238

原创 RecyclerView入门

什么是recyclerView?我们常见的可以滑动的,分块的视图样式就可以认为是recyclerView。比如:在开发前还需要了解一些概念:ViewHolder:可以看到recyclerView是以分块的视图形式组织的。分块无论其形状,里面的内容如何,每一个分快称之为ViewHolder。上图中一个title+subtitle的条形分块就是一个ViewHolder。

2024-03-17 19:57:13 814

原创 stable diffusion学习笔记 手部修复

某张图片在生成后,仅有手部表现不符合预期(多指,畸形等)。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作,重新绘制手部区域。但是仅采用重绘的方式也很难保证生成的手没有问题。因此这里我们采用【contorlNet】进行辅助,定向生成某种手部的形状。

2024-02-25 20:46:28 1697

原创 stable diffusion学习笔记——高清修复

以上问题说明了,玩ai画图,需要掌握提高画图分辨率的方式,同时要掌握方式对应的技巧,避免出现画面内容的问题。

2024-02-03 21:49:39 956

原创 stable diffusion学习笔记——文生图(二)

LORA和Embeddings都可以对画面内容进行调整。目前LORA主要用来定义画面特征,如具体的人物,衣物,画风等。Embeddings目前主要用于反面提示词中,用来避免错误的画面表现。

2024-01-28 15:24:55 464

原创 stable diffusion学习笔记——文生图(一)

基本模型也就是常说的checkpoint(大模型),基本模型决定了生成图片的主体风格。如上图所示,基本模型的后缀为.safetensors。需要存放在特定的文件夹下。如果用的是启动器,可以在启动器内直接下载。

2024-01-27 12:42:34 1320

原创 c++函数返回字符串指针

在以上代码中,在函数中创建一个字符数组,直接将字符数组的名称作为char类型的指针作为返回值向外传递。这种做法是错误的,编译器会弹出警告:Address of stack memory associated with local variable 'chp' returned。意思是将在栈上的局部变量返回了,这在c++中是不推荐的。问题的原因在于,testfunc1中的字符数组chp属于局部变量,位于内存的栈区,因此指针*p指向的是栈里的局部变量。

2022-09-22 16:54:39 2240 1

原创 c++ strcpy相关坑点

strcpy的作用是将一个字符串的内容复制到另外一个字符串中,覆盖原有的内容。常见的例程有:将字符数组里的内容复制到字符数组里。将字符串常量里的内容复制到字符数组里。需要注意的是,在c++中char *p这样的变量是存放在常量区。

2022-09-22 15:31:24 1024

原创 Linux 文件/目录访问(opendir/closedir/readdir)

在Linux系统中我们需要在一个特定目录下对该目录下所有的文件以及目录(文件夹)进行便利访问。Linux获取目录文件的流程如下:1.打开指定目录,使用opendir得到目录句柄。2.while循环中使用readdir获取目录的内容,并存储到struct dirent 结构体变量中。3.dirent结构体变量存储了文件/文件夹的一些属性,可以通过这些属性进行一些差异化操作。4.最后关闭目录句柄closedir。

2022-09-21 16:23:02 1961

原创 c++ 程序中使用命令行

头文件函数原型函数功能popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。如果type是"r"则文件指针连接到command的标准输出,读取命令的标准输出;如果type是"w"则文件指针连接到command的标准输入,写入命令的标准输入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。

2022-09-20 21:05:23 6040

原创 c++ void*讲解

在指针操作中void* 是常用的一种指针,也被称为无类型指针,该指针可以认为是指针类型的一种抽象。

2022-09-16 11:00:11 510

原创 java 低耦合观察者模式

在之前的文章中,虽然被观察者并不依赖于观察者,但是被观察者知道观察者的存在,这就出现了一定程度的耦合关系。我们通常希望一个观察者模式是这样的:1.观察者依赖于被观察者,被观察者不依赖于观察者。2.被观察者最好不知道观察者的存在,既能独立工作,又能减少与观察者的耦合关系。

2022-09-14 17:52:19 509

原创 Android HandlerThread例程

在多线程通信中我们通常使用handler进行异步通信。在线程中使用handler稍微有一些麻烦,比如说创建handler的时候必须保证当前线程中有Looper对象,否则会创建失败。安卓的主线程自带一个Looper,但是我们手动创建的子线程是不会自带Looper对象的,因此我们如果想要在子线程接收信息,也就是在子线程创建handler,就必须在子线程先创建Looper对象,有点麻烦。于是HandlerThread可以解决这个问题,里面内部自带了Looper对象。

2022-09-14 10:57:44 612

原创 Java的synchronized关键字用法

可以自定义一个任意实例对象,实现对代码块的同步。

2022-09-13 16:12:14 229

原创 JNI学习5.jstring的处理

代码中GetStringUTFChars能够得到一个修改后的utf8类型的字符串,将该字符串赋值给需要返回的字符串即可。此外需要ReleaseStringUTFChars对临时创建的char指针进行内存释放。

2022-09-02 15:01:02 2080

原创 Android多线程实现

Android基础的多线程实现方式主要有两种,一种是创建一种线程类并直接继承Thread类,重写其run函数实现线程功能,第二种是实现Runnable接口,通过线程辅助类实现线程功能。

2022-08-17 20:17:35 1492

原创 Android Handler例程(sendMessage与post)

在安卓中,只有主线程才能进行UI操作。说明子线程内无法实现对UI的修改,因此安卓必然支持一种线程通信机制,使得子线程可以发消息让主线程改一下UI,该方案就是handler。安卓中子线程之间也需要通信,通信方案也是handler。......

2022-08-15 16:58:31 1981 1

原创 观察者模式

观察者模式常用于一对多的监听情景,并且被监听者可以实现监听者的回调,也就是说被监听者能够触发监听者的动作,该动作就是回调。观察者模式的特点:1.被观察者不知道具体的观察者是谁,只知道自己被观察了,并且在合适的时机进行广播,让感兴趣的观察者知道发生了什么事情。2.观察者依赖于被观察者,被观察者不依赖于观察者,是单向关系,耦合程度不高。没有被观察者,观察者无法工作;没有观察者,被观察者该干啥干啥,因为被观察者本来就不清楚谁观察他,发广播是被观察的个人行为。......

2022-08-10 21:38:43 1757

原创 EventBus3 笔记

eventbus是安卓开发中常用的消息传递工具,能够有效对发送方与接收方解耦合。

2022-08-10 11:55:04 320

原创 JNI学习4.动态注册

静态注册较为简单,只需要在Java程序中声明jni函数,随后在cpp程序中实现此jni函数即可。静态注册的实现方式为:当java程序第一次使用某个jni函数时,会进行搜索,根据包名-类名-函数名进行搜索,随后与对应的jni函数建立连接,随后便可以调用。由于虚拟机自动实现了注册匹配,所以在实际编写中比较省力,名字匹配了就可以直接用。但是静态注册有一些缺点:1.函数名称需要匹配,不能自定义。2.每个jni函数第一次被调用时都需要搜索,增加了额外开销。如果工程中的jni函数较多,在搜索方面可能会花费较多时间。..

2022-08-04 17:51:58 845

原创 JNI学习3.cpp代码在android studio打印日志

从代码中可知,“CPPLOG”就是日志的tag,可以自定义修改。代码运行时在logcat中搜索CPPLOG就可以找到相关的日志。为了方便调试,通常在Java代码中打印日志。但是在jni开发中,如果c++函数也需要打印日志进行调试,就必须进行额外设置。LOGD,LOGI,LOGE是三种类型的日志,和java日志原型是一一对应的。4.在Java程序中调用jni函数,日志输出结果。3.在jni函数中进行调用。......

2022-08-04 11:20:05 1208

原创 JNI学习2.jni函数调用java方法

这里需要注意com.example.hello_cmake.TestCallBack是类的完整路径,但是识别的时候是以Linux标准进行的,因此里面的.要替换成/来表示路径。jni函数本身也算是java类的一个成员方法,在调用的时候,需要先实例化TestCallBack类,再进行调用。在java中,类的成员方法必须以实例调用的形式调用,因此必须实例化一个对象,才能调用成员函数add。调用方法的函数参数中,前两个分别为实例与方法的ID,后面的参数则是调用的java方法的参数。第三步:实例化一个对象。.....

2022-08-03 20:22:15 2161

原创 查看java函数签名

在jni函数开发中需要知道被调用的java函数的函数签名,在android studio内即可完成操作。首先对工程build一下,得到build文件夹。

2022-08-03 17:16:59 876

原创 JNI学习1.环境配置与简单函数实现

本文使用的android studio版本是2021年的版本,自android studio之后对JNI的配置就比较简单,因为LLDB已经默认集成到了android studio中。打开SDK manager,在SDK tools里面将NDK与CMake一起下载即可,可以点击右下角的show package details,展示具体的版本进行下载安装。......

2022-08-03 15:40:14 412 1

原创 Android cannot resolve constructor intent解决

intent的原型是Intent(Contextcontext,Classclass),从当前的context跳转到class,问题在于当前的context到底是谁的context。由于监听器是一种内部类,所以在监听器中的this指代的并不是当前的活动,而是当前的监听器。上面的语句我写在了一个button的监听器中,这也是造成错误的原因。该语句的作用为从当前的活动跳转到活动MainActivity2。因此需要将context参数进行正确的定位。...

2022-07-31 21:00:38 487 3

原创 c++ RTTI

RTTI的意思是运行时类型识别,之所以存在这个功能,是因为c++通过父类指针实现多态,父类指针可以指向自己所有的派生类对象,指的多了就会出现问题,程序到某一时刻,父类指针究竟指向哪种派生类对象呢?假设有个父类是Human,子类是Men(毕竟男人属于人类的一种)。通过以上语句,令Human类型的指针指向一个Men对象,Human类中存在虚函数,因此构成了一种多态。但是时间久了,隔了好多行代码,Human这个父类又有一堆子类,因此很容易在某个时间节点搞不清楚当前的*phuman指向的到底是哪种类型,因此需

2022-06-20 11:27:09 434

原创 c++读取配置文件

在实际开发中,程序读取配置文件以加载数据非常常见,如何安全高效地读取文件比较重要。本文代码来自于《c++新经典》。 假设有一个txt格式的文件,里面记录了花里胡哨的内容,需要把这些内容一字不差地读取到程序中,应该如何用c++实现?书中的代码如下:结果如下图所示,已经完整地将配置文件的内容打印出来了。 代码使用一个字符数组记录每行内容,为防止读取失败,代码中通过第一位清零并查询的方式检查:如果不需要代码非常严谨,可以将以上的内容从代码中删除。读取一行文本的核心实现是以下代码:fgets函数读

2022-06-18 21:19:48 3009

原创 ffmpeg+SDL2实现音频播放

本文记录使用ffmpeg+SDL2进行视频文件内的音频播放,注意是播放视频文件内的音频,不是播放音频文件。本文使用的ffmpeg版本为5.0.1,SDL的版本为2.022。c++环境为vs2017。和之前的播放视频或音频明显的区别是,播放视频文件内的音频需要进行重采样操作,代码中会引入重采样结构体SwrContext。重采样结构体能够改变原先音频的采样率、声道数等参数,令各种音频能够按照我们设定的参数进行输出。这样做的原因是不同视频文件内的音频参数通常区别较大,如果分别处理工作量太大,不如将其统一成相同的格

2022-06-17 10:14:43 887

原创 SDL2播放pcm音频

作为播放器,只会播放视频还是不行的,因此需要研究一下SDL如何播放音频。SDL播放音频的过程相对于播放视频更为简单,主要流程如下:初始化工作:1.初始化SDL2.根据设定参数打开音频设备循环播放:1.播放音频数据2.延时等待播放完成#include <stdio.h>#include <tchar.h>#include <iostream>extern "C"{#include "SDL.h"};using namespac

2022-05-21 09:58:12 657 1

原创 ffmpeg+SDL2实现播放器(三)

前面的文章中实现一个固定帧率的视频播放器,但是光有播放功能似乎没有那个味道。因此本次增加了暂停/继续功能,按键关闭播放器功能,以及帧率改变功能。PS:实现帧率改变的初衷是改变播放视频的速度,但是总感觉这样的实现方式并不好,因为当你加速播放的时候,一秒内极有可能处理相当多的视频帧,会对播放设备产生明显影响,因此暂时认为对视频的加减速播放应该有更优的方案。整体代码如下:#include<iostream>#include<string.h>#include<SDL

2022-05-20 10:08:57 333

原创 ffmpeg+SDL2实现播放器(二)

在上一篇文章中,代码的画面刷新不是定期实现的,这就导致视频的播放速度与实际不符,因此我们需要对其进行修改,使用多线程实现画面刷新的控制。该工程使用的ffmpeg版本为5.01,SDL版本为2.0.22。#include<iostream>#include<string.h>#include<SDL.h>extern "C"{#include "libavformat/avformat.h" //头文件不仅要在项目中鼠标点击配置,在代码中也要引入#in

2022-05-13 16:06:10 729

原创 ffmpeg + SDL2 实现播放器(一)

使用的ffmpeg版本为5.0.1,SDL的版本为2.022。c++环境为vs2017。先上最简易的整体代码,初步实现了SDL和ffmpeg的结合。#include<iostream>#include<string.h>#include<SDL.h>extern "C"{#include "libavformat/avformat.h" //头文件不仅要在项目中鼠标点击配置,在代码中也要引入#include "include/libavformat/

2022-05-12 15:46:20 2379 1

原创 SDL2画面刷新

学会SDL的事件与渲染机制之后,增加画面刷新机制就可以成为一个播放器了。在上一篇文章中讲过,似乎循环执行SDL_RenderPresent(renderer)就可以令视频逐帧播放了,为什么还要引入刷新机制呢?这是因为在一个循环中,重复执行一个函数的效果通常不是周期性的,因为每次加载和处理的数据所消耗的时间是不固定的,因此单纯地在一个循环中使用SDL_RenderPresent(renderer)会令视频播放产生帧率跳动的情况。因此需要引入一个定期刷新机制,令视频的播放有一个固定的帧率。通常使用多

2022-05-11 14:34:11 1090

原创 SDL2的渲染

使用SDL2播放视频时需要通过渲染操作令视频的每一帧在窗口的显示。SDL播放视频的流程如下图所示:初始化组件:SDL_Init(); //初始化SDLSDL_CreateWindow(); //创建播放器的窗口SDL_CreateRenderer(); //创建基于窗口的渲染器SDL_CreateTexture(); //创建基于渲染器与视频格式的纹理循环渲染:SDL_UpdateTexture(); //设置纹理的数据SDL_Rende

2022-05-10 19:14:16 699

原创 SDL2播放yuv视频文件与事件(event)

1.整体代码先上代码:#include <stdio.h>#include <string.h>#include <SDL.h>//自定义消息类型#define REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件#define QUIT_EVENT (SDL_USEREVENT + 2) // 退出事件//定义分辨率// YUV像素分辨率#define YUV_WIDTH

2022-05-10 15:57:13 512

原创 使用ffmpeg指令转换出yuv视频文件

播放器播放的都是经过解码后的视频,也就是yuv格式的视频文件,因此在学习的过程中需要准备一下yuv格式的视频做实验素材,这里演示如何在电脑中使用ffmpeg指令将一个视频文件转换为.yuv格式。1.打开视频文件路径下的shell视频文件一般存放在电脑中任何位置里,因此需要将shell定位到该路径下才能使用命令行。在视频所在的文件夹里按住shift键右键单击空白处,选择“在此处打开powershell窗口”,这样shell就定位到当前位置了。2.使用ffmpeg指令以该文件下的ds

2022-05-02 21:10:56 5481

原创 vs配置SDL2.0

这里记录下在vs2017配置SDL2.0。1.下载源文件下载地址如下图所示,注意需要下载visual c++对应的版本。2.解压将文件夹存放在一个不包含中文路径的地方,解压,注意文件夹中只有include文件夹和lib文件夹是我们需要的。3.新建一个vc++项目注意我们使用的版本是x64的,因此在配置过程中所看到的一切“x86”的东西都要改成“x64”。4.右键单击左侧管理器的项目名称(“SDL2Test”),选择属性,进行配置。平台的类型要改成x64..

2022-05-02 20:10:45 1266 1

原创 ffmpeg读取packet数据

在ffmpeg中,使用AVPacket结构体表示视频文件中的压缩数据,也就是还未进行解压缩的原始视频帧与音频帧。整体代码如下:#include<iostream>#define __STDC_CONSTANT_MACROSextern "C"{#include "libavcodec/avcodec.h"#include "include/libavformat/avformat.h"#include "include/libswscale/swscale.h"#incl

2022-05-02 16:23:07 1689

CoinProject.zip

基于QT C++的翻金币小游戏,自己跟着传播智客的教程写的,含源代码和资源文件,代码附有超级详细注释,适合新手学习。

2021-05-12

qt-everywhere-src-5.14.1.tar.xz

QT5.14,官网提供的新版本,可在linux系统中编译安装。不需要去官网低速下载了。同时该版本的QT需要8.3版本的交叉编译工具链才可进行交叉编译,要求较高。

2020-06-30

gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz

gcc-arm-8.3交叉编译工具链,可用于linux系统中程序的交叉编译,版本较高适用于QT。不用去下载了

2020-06-30

空空如也

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

TA关注的人

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