- 博客(130)
- 资源 (13)
- 收藏
- 关注
原创 音视频之H.265码流分析及解析
H.265又称为HEVC(全称High Efficiency Video Coding,高效率视频编码,本文统称为H.265),是 ITU-T H.264/MPEG-4 AVC标准的继任者。2004年由ISO/IEC Moving Picture Experts Group(MPEG)和 ITU-T Video Coding Experts Group(VCEG)作为ISO/IEC 23008-2 MPEG-H Part 2或称作ITU-T H.265开 始制定。第一版的HEVC/H.265视频压缩标准在
2025-03-19 10:30:35
890
原创 LearnOpenGL之Shader编程——生成设计
网格噪声基于距离场,这里的距离是指到一个特征点集最近的点的距离。比如说我们要写一个 4 个特征点的距离场,我们应该做什么呢?对每一个像素,计算它到最近的特征点的距离。也就是说,我们需要遍历所有 4 个特征点,计算他们到当前像素点的距离,并把最近的那个距离存下来。
2025-02-28 18:03:26
915
原创 LearnOpenGL之Shader编程用算法绘画
如果你曾经有用计算机绘图的经验,你就知道在这个过程中你需要画一个圆,然后一个长方形,一条线,一些三角形……直到画出你想要的图像。这个过程很像用手写一封信或一本书 —— 都是一系列的指令,需要你一件一件完成。 Shaders 也是一系列的指令,但是这些指令会对屏幕上的每个像素同时下达。也就是说,你的代码必须根据像素在屏幕上的不同位置执行不同的操作。就像活字印刷,你的程序就像一个 function(函数),输入位置信息,输出颜色信息,当它编译完之后会以相当快的速度运行。
2025-02-28 18:03:05
817
原创 LearnOpenGL之骨骼动画
(动画)插值就是关键帧的中间值。比如我们使用Blender制作动画,不需要设置每一帧的骨骼位置,只需要在几个关键帧中记录它们的位置,旋转,缩放等等信息。然后由程序自动计算出的中间的过渡帧就是我们的插值。通常插值可以使用曲线描述,比如我们的贝塞尔曲线。
2025-02-13 17:26:50
769
原创 GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。
帧缓冲对象(Framebuffer Object, FBO)是 OpenGL 中用于管理渲染目标的核心工具。它允许你将渲染结果输出到纹理、渲染缓冲对象(Renderbuffer)或其他自定义的缓冲区,而不是默认的屏幕缓冲区。帧缓冲在图形渲染中具有重要作用。 以下是帧缓冲的主要作用和应用场景:
2025-01-23 20:41:18
1653
1
原创 LearnOpenGL之高级OpenGL(2)
当使用多于一个的着色器时,尽管大部分的uniform变量都是相同的,我们还是需要不断地设置它们,所以为什么要这么麻烦地重复设置它们呢? OpenGL为我们提供了一个叫做Uniform缓冲对象(Uniform Buffer Object)的工具,它允许我们定义一系列在多个着色器程序中相同的全局Uniform变量。当使用Uniform缓冲对象的时候,我们只需要设置相关的uniform一次。当然,我们仍需要手动设置每个着色器中不同的uniform。并且创建和配置Uniform缓冲对象会有一点繁琐
2025-01-21 11:08:29
816
原创 LearnOpenGL之高级OpenGL(1)
帧缓冲对象的初始化首先要创建一个帧缓冲对象,并绑定它,这些都很直观:接下来我们需要创建一个纹理图像,我们将它作为一个颜色附件附加到帧缓冲上。我们将纹理的维度设置为窗口的宽度和高度,并且不初始化它的数据:创建渲染缓冲对象:将渲染缓冲对象附加到帧缓冲的深度和模板附件上:绑定到帧缓冲区,像往常一样绘制场景以着色纹理。
2025-01-17 16:03:44
815
原创 OpenGL C++视频中添加图片及文字水印播放并录制
根据前置储备,该功能的实现流程:创建一个GLThread的OpenGL运行环境;YUV数据绘制到OpenGL纹理中;图片纹理创建绘制到glViewport;文字渲染绘制到glViewport;录制视频的surface并根据此切换GLContext上下文交换(swapBuffer)渲染与显示的视频数据 ;MediaCodec获取出encodeData写入MediaMuxer成为MP4文件格式的视频
2024-11-14 21:33:46
1319
原创 LearnOpenGL之文字渲染
FreeType是一个能够用于加载字体并将他们渲染到位图以及提供多种字体相关的操作的软件开发库。它是一个非常受欢迎的跨平台字体库,它被用于Mac OS X、Java、PlayStation主机、Linux、Android等平台。FreeType的真正吸引力在于它能够加载TrueType字体。TrueType字体不是用像素或其他不可缩放的方式来定义的,它是通过数学公式(曲线的组合)来定义的。类似于矢量图像,这些光栅化后的字体图像可以根据需要的字体高度来生成。通过使用TrueType字体,你
2024-11-04 18:26:36
1293
原创 LearnOpenGL之3D模型加载
将所有需要的向量储存到一个叫做Vertex的结构体中,我们可以用它来索引每个顶点属性。将纹理数据整理到一个Texture结构体中。储存了纹理的id以及它的类型,比如是漫反射贴图或者是镜面光贴图。在构造函数中,我们将所有必须的数据赋予了网格,我们在setupMesh函数中初始化缓冲,并最终使用Draw函数来绘制网格。注意我们将一个着色器传入了Draw函数中,将着色器传入网格类中可以让我们在绘制之前设置一些uniform(像是链接采样器到纹理单元)。public:/* 网格数据 */
2024-10-25 18:21:13
955
原创 OpenGL Texture C++ Camera Filter滤镜视频录制
OpenGL Texture C++ Camera Filter滤镜视频录制; 基于文章1/2/3的代码,结合Google开源项目grafika中的WindowSurface.java/Coregl.java/TextureMovieEncoder2.java/VideoEncoderCore.java创建出录制视频的surface并根据此切换GLContext上下文交换(swapBuffer)渲染与显示的视频数据,最终在VideoEncoderCore中通过MediaCodec获取出encodeDat
2024-10-19 15:29:34
1052
原创 OpenGL 自定义SurfaceView Texture C++预览Camera视频
由上GLSurfaceView源码分析可知,内部维护着一个GLThread子线程,用来保持GL的上下文GLConext一致性的操作。接下来仿造GLSurfaceView创建一个同样继承于SurfaceView的自定义类WyyGLSurfaceView。WyyGLSurfaceView是在OpenGL Texture C++ 预览Camera视频-优快云博客中GLTextureCPlusVideoPlayView进行改造的,有兴趣的可翻看我的这一篇的博客。
2024-10-12 16:07:01
1254
原创 OpenGL Texture C++ Camera Filter滤镜
基于OpenGL Texture纹理的强大功能,在片段着色器(Shader)中编写GLSL代码,对YUV的数据进行数据转换从而实现视频编辑软件中的相机滤镜功能。接上一篇OpenGL Texture C++ 预览Camera视频的功能实现,本篇来实现Camera滤镜效果并各种滤镜的切换。
2024-09-15 15:50:47
1255
原创 OpenGL Texture C++ 预览Camera视频
OpenGL是一个图形API,并不是一个独立的平台。包含了一系列可以操作图形、图像的函数。基于Texture纹理强大的功能,本篇文章实现Android OpenGL Texture C++ 预览Camera视频流的功能。
2024-09-06 18:37:20
1481
原创 LearnOpenGL之光照
现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为风氏光照模型(Phong Lighting Model)。风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子
2024-08-16 18:52:31
980
原创 LearnOpenGL之摄像机
当我们讨论摄像机/观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标。要定义一个摄像机,我们需要它在世界空间中的位置、观察的方向、一个指向它右侧的向量以及一个指向它上方的向量。细心的读者可能已经注意到我们实际上创建了一个三个单位轴相互垂直的、以摄像机的位置为原点的坐标系。
2024-08-06 18:07:40
924
原创 LearnOpenGL之3D显示
绑定texture(纹理)——使用程序——开启深度测试—— 模型矩阵(Model Matrix)观察矩阵(View Matrix)、投影矩阵(Projection Matrix)的初始化创建并与顶点着色器中model/view/projection 的uniform进行数据交换。模型矩阵(Model Matrix)观察矩阵(View Matrix)、投影矩阵(Projection Matrix)组合矩阵传入到gl_position做对应的顶点数据的位置变换。
2024-08-02 18:37:38
1001
原创 LearnOpenGL之入门基础
OpenGL是一个图形API,并不是一个独立的平台。包含了一系列可以操作图形、图像的函数。本文对LearnOpenGL知识的总结及记录。 AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合: Github地址:https://github.com/wangyongyao1989/AndroidLearnOpenGL
2024-07-31 19:12:13
1000
原创 C++并发编程实战学习笔记
将应用程序分为多个独立的进程,它们在同一时刻运行,就像同 时进行网页浏览和文字处理一样。独立的进程可以通过进程间常规的通信渠道传递讯息(信号、套接字、文件、管道等等。不过,这种进程之间的通信通常不是设置复杂, 就是速度慢,这是因为操作系统会在进程间提供了一定的保护措施,以避免一个进程去修改 另一个进程的数据。还一个缺点是,运行多个进程所需的固定开销:需要时间启动进程,操 作系统需要内部资源来管理进程,等等。
2024-07-19 15:09:26
380
原创 通过libx246 libfaac转换推送RTMP音视频直播流
RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。RTMP是应用层协议,采用(通常)TCP来保证可靠传输;在TCP完成握手链接建立后,还会进行RTMP的一些自己的握手动作,在建立RTMP Connection链接;
2024-07-19 15:04:05
1390
原创 音视频及H264/H256编码相关原理
我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。如FFmpeg 视频文件就是一个容器 (视频流(H264) 音频流(aac))。
2024-05-24 18:52:08
3116
原创 Java并发编程及并发包中类分析
AbstractOueuedSynchronizer 是java.util.concurrent 的核心组件之一,它提供了一个基于 FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该类利用了一个int 来表示状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire 和release 的方式来操纵状态。然而,多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握。
2024-05-11 15:02:45
1154
1
原创 FFmpeg常用结构体、关键函数、ffplay.c分析
AVFormatContext是一个贯穿全局的数据结构,很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context,此结构包含了一个视频流的格式内容。其中存有AVIputFormat(或AVOutputFormat,但是同一时间AVFormatContext内只能存在其中一个)、AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title、author、copyright等。
2024-04-26 19:05:09
1301
3
原创 MAVLink分析及封装自定义的类MavLink通信协议
通过自动生成mavlink的协议代码,我们可以此基础上进行自定义的拓展。形成自己通信协议。··首先我们把协议通信命令区分为发送和接收:AckMsg和CmdMsg两类,分别用于接收和发送。AckSysInfo类会解析出playload的属性值://解析出payload包含的实体数值@Override'}';CmdSysInfo会包playload的属性值包装成一个MyLinkPacket:@Override。
2024-03-29 11:39:07
2667
2
原创 Kotlin协程知识点概述
Kotlin 是⼀⻔仅在标准库中提供最基本底层 API 以便各种其他库能够利⽤协程的语⾔。与许多其他具有类似功能的语⾔不同,async 与 await 在 Kotlin 中并不是关键字,甚⾄都不是标准库的⼀部分。此外,Kotlin 的 挂起函数概念为异步操作提供了⽐ future 与 promise 更安全、更不易出错的抽象。kotlinx.coroutines 是由 JetBrains 开发的功能丰富的协程库。它包含本指南中涵盖的很多启⽤⾼级协程的原语,包括 launch 、async 等等。
2024-03-26 18:44:43
937
原创 Kotlin编程权威指南学习知识点预览
函数支持包括函数在内的任何类型的参数。一个函数类型的参数定义起来和其他类型的参数 一样:在函数名后的一对圆括号内列出,再加上类型。"你好我的名字叫: $myName" + ",今年:$age 岁了"在面向对象编程的世界里,类是核心,是一类独特“事 物”的代码形式的定义。具体来讲,类定义的是事物包含哪一类数据,能做什么样的工作。类可以定义在一个独立的文件中,也可以和函数或变量定义在一起。类定义在单独一个文件 里,可以给应用程序未来的规模升级预留扩展空间。
2024-03-14 18:45:41
1065
原创 C++ STL标准程序库开发指南学习笔记
模板库(STL):STL另一个重要特性是它不是面向对象的。STL主要依赖于模板。这使得STL的组件具有广泛通用性和底层特性。由于STL是基于模板的,内联函数的使用使得生成的代码短小高效。类模版实例化:类模版仅仅是模板,如何使用模板就涉及类模板的实例化问题。模板实例化一般指使用模板类和模板参数生成一个类声明的过程。类模板的成员函数:可被类模板实例化产生的类所拥有。每个类模板都拥有自己相应的成员函数,这些函数可被模板的实例调用。
2024-03-01 17:34:00
1436
原创 C++基础知识点预览
数组是以系列元素;数据中所有元素的类型都相同;这组元素形成一个完整的集合。预处理器在编译之前运行,预编译器指令都以#打头。C++程序通常在.h(头文件)中声明类和函数,并在.cpp文件中定义函数,因此需要在.cpp文件中使用预处理器编译指令#include来包含头文件。#define定义常量;#ifndef和#endif:在预处理器看来,两个头文件包含对方会导致递归问题。为避免这种问题,可结合使用过宏以及预处理器编译指令#ifndef和#endif;
2024-02-08 16:39:37
1065
原创 Android AutoSize屏幕适配中图标及字体放大的问题解决
现象:项目接入Android AutoSize屏幕适配框架,项目本身主界面是横屏操作的界面。测试中用户反馈在vivo x27的手机或者其他机型也会出现(没测试出来)横屏后所有的图标及字体都放大。原因查找:查看Android AutoSize的源码可知,isBaseOnWidth的标志位为屏幕适配的基准。在获取资源文件getResources()的对图片/文字及其他资源文件可以指定具体的适配方案,vivo x27横屏转换后获取的宽高对调了,所以导致原本以宽(或者高)为基准数值相对调,导致界面的图.
2021-07-04 11:44:55
2271
原创 Android工程师进阶34讲学习笔记
拉勾教育是最近发现一个技术提升的平台,很多课程对于技术提升都多有益处,很多是实际上的项目实战并对底层原理讲解透彻。前几个月已经学习完了姜新星的《Android 工程师进阶 34 讲》,现在重学一遍并做些总结记录加深印象。学习的过程要符合遗忘曲线,当一些所学的知识遗忘时就是该重新复学的开始,这样真正学到的知识才能刻进大脑里变成自己的知识,把书读薄在运用到的时候“下笔如有神”。一.程序运行时内存的分配:Java 虚拟机在执行 Java 程序的过程中,会把它所管理的内存划分为不同的数据区域。下面这张图描述
2020-10-26 14:17:07
1170
3
原创 设计模式之美(王争)摘录总结
经过八个月的学习,极客时间中王争的设计模式之美。最近又重读两遍,真是遍受益匪浅啊,学习之后才知道代码可以这样设计这样优美的编写。觉得自己有摘录一些在学习中认为比较好的精华,以备自己以后的查用和复习。一.术语描述:面向对象编程:具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础; 面向对象语言:是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言; 设计原则:是指导我们代.
2020-09-13 18:54:32
3633
1
原创 FFmpeg项目初探学习笔记
FFmpeg是广泛使用于的多媒体解决方案,是一个自由软件项目的名称,采用LGPL或GPL许可证。它提供了录制/转换以及流化音视频的完整解决方案。包含非常先进的音频/视频编解码库libavcodec。为了保证高可移植性和编解码质量,libavcodec里很多代码都是新开发的。“FFmpeg”这个词中的“FF”指的是“Fast Forward”,而“mpeg”指的是一种压缩率比较大的活动图像和声音的压缩标准。一.FFmpeg简介:命令行工具概述(Command Line Tool Documentati
2020-08-22 11:22:36
348
原创 C++入门知识点总结——面向对象/高级编程
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。1.面向对象:类&对象:类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。类的定义:类定义是以关键字class开头,后跟类的名称。class Box{ public: double length; // 盒子的长度 double breadth;
2020-07-04 18:57:36
418
原创 C++入门知识点总结——基本语法
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。1.面向对象程序设计:C++ 完全支持面向对象,包括面向对象开发的四大特性:封装 抽象 继承 多态C++标准库的组成:核心语言,提供了所有构件块,包括变量、数据类型和常量等; C++ 标准库,提供了大量的函数,用于操作文件、字符串等; 标准模板库(STL),提供了大量的方法,用于操作数据结构等。C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互:
2020-06-21 18:42:55
2709
原创 Gradle入门及相关总结
Gradle是一款非常优秀的构建系统工具,它的DSL是基于Groovy实现。可以方便通过代码控制这些DSL达到构建目的,Gradle构建大部分功能是通过插件方式来实现。1.Gradle入门及Gradle Wrapper:Wrappe是对Gradle的一层包装,便于团队在开发过程中统一Gradle构建版本,避免因为Gradle构建版本不同意带来的不必要麻烦。gradlew和gradlew.bat分别是Linux和window下的可执行脚本,用法跟Gradle原生命令一样; gradle-w.
2020-06-13 22:51:52
253
原创 查看Android源码中的Native/JNI/C/C++代码
最近在学习Android音视频流方面的知识,买了何俊林的《Android音视频开发》。一看书吓一跳好多JNI/C/C++方面的代码,如今是初步学习了JNI了,也有一些C/C++的功底。但怎么查看Android源码中的Native/JNI/C/C++代码一直苦恼了很久,没办法查看这些代码就无法进行下一步学。现在在网上看到了一篇能查看源码的文章查看native层源码的文章,终于了看对应代码示例了。登录AndroidXRef网站; 选择SDK版本;; 进入搜索界面,输入对应的匹配字符,点击搜索:
2020-05-24 18:36:46
2728
原创 Java 本地接口(JNI)编程设计规范
"JNI"解决了一个问题,类似于(similar to)通过被其他语言支持的互操作机制来解决的问题。然而,在"JNI"和在许多其他语言中的互操作机制之间有一明显的不同。"JNI"不是为一个特别的"Java"虚拟器的实现设计的。而是,一个本地接口能过被每个"Java"虚拟器的实现支持的。1.JNI设计目的:"JNI"设计的最重要目标是确保它在一个给定的主机环境上不同的"Java"虚拟器实现中提供二进 制兼容性。同样的本地库的二进制不需要在编译(without the need for recom.
2020-05-23 14:26:22
561
原创 Java 本地接口(JNI)编程指南和规范学习笔记1
1.Java平台环境简介:"Java"平台的编程环境包含"Java"虚拟机(VM)和Java应用程序编程的接口(Java Application Programming Interface(API))。"Java"应用程序是用"Java"编程语言编写的,被编译成一个独立于 机器(machine-independent)二进制类格式.一个类在任何Java虚拟机上执行实现。Java的API包 含预定义的类集合。Java"平台的任何实现被假设支持Java编程语言,虚拟机和"API"。...
2020-05-17 18:06:44
389
Android下自动连接指定SSID的WIFI的简单实现的demo
2018-10-31
GamepadView、JostickView仿创客工场中的遥感的自定义View
2018-08-04
Android Blockly积木编程源码对Workspace中的block数据保存及读取的流程,及改造原生代码实现Trash垃圾桶中的block保存及读取
2018-01-31
Android 画布Canvas之控件连线操作Demo
2017-07-24
Android自定义万能Canvas画布Demo
2017-07-17
Android自定义画布及环形菜单
2017-07-02
Android中RecyclerView的item运用覆盖view的方法实现item的动画效果1
2017-04-04
Android中RecyclerView的item运用覆盖view的方法实现item的动画效果
2017-04-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人