自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 收藏
  • 关注

原创 Opengl ES之文字渲染

Opengl ES之EGL环境搭建Opengl ES之着色器Opengl ES之三角形绘制Opengl ES之四边形绘制Opengl ES之纹理贴图Opengl ES之VBO和VAOOpengl ES之EBOOpengl ES之FBOOpengl ES之PBOOpengl ES之YUV数据渲染YUV转RGB的一些理论知识Opengl ES之RGB转NV21Opengl ES之踩坑记Opengl ES之矩阵变换(上)Opengl ES之矩阵变换(下)Opengl ES之水印贴图。

2023-03-21 14:24:11 735 1

原创 Opengl ES之水印贴图

Opengl ES之EGL环境搭建Opengl ES之着色器Opengl ES之三角形绘制Opengl ES之四边形绘制Opengl ES之纹理贴图Opengl ES之VBO和VAOOpengl ES之EBOOpengl ES之FBOOpengl ES之PBOOpengl ES之YUV数据渲染YUV转RGB的一些理论知识Opengl ES之RGB转NV21Opengl ES之踩坑记Opengl ES之矩阵变换(上)Opengl ES之矩阵变换(下)Opengl ES之水印贴图。

2023-03-21 14:23:15 520

原创 Opengl ES之矩阵变换(下)

Opengl ES之EGL环境搭建Opengl ES之着色器Opengl ES之三角形绘制Opengl ES之四边形绘制Opengl ES之纹理贴图Opengl ES之VBO和VAOOpengl ES之EBOOpengl ES之FBOOpengl ES之PBOOpengl ES之YUV数据渲染YUV转RGB的一些理论知识Opengl ES之RGB转NV21Opengl ES之踩坑记Opengl ES之矩阵变换(上)Opengl ES之矩阵变换(下)Opengl ES之水印贴图。

2023-03-21 14:22:18 401

原创 Opengl ES之矩阵变换(上)

Opengl ES之EGL环境搭建Opengl ES之着色器Opengl ES之三角形绘制Opengl ES之四边形绘制Opengl ES之纹理贴图Opengl ES之VBO和VAOOpengl ES之EBOOpengl ES之FBOOpengl ES之PBOOpengl ES之YUV数据渲染YUV转RGB的一些理论知识Opengl ES之RGB转NV21Opengl ES之踩坑记Opengl ES之矩阵变换(上)Opengl ES之矩阵变换(下)Opengl ES之水印贴图。

2023-03-21 14:21:15 341

原创 Android线程池原理详解

但凡有点开发经验的同学都知道,频繁的创建和销毁线程是会给系统带来比较大的性能开销的。所以线程池就营运而生了。那么使用线程池有什么好处呢?

2023-02-17 14:04:33 580

原创 Handler postDelayed的实现原理

Android消息队列Handler的延迟消息实现原理。

2023-02-17 14:03:18 560

原创 DialogFragment内存泄露问题能不能一次性改好

自DialogFragment在Android3.0之后作为一种特殊的Fragment引入,官方建议使用DialogFragment代替Dialog或者AllertDialog来实现弹框的功能,因为它可以更好的管理Dialog的生命周期以及可以更好复用。然而建议虽好,实用须谨慎,在开发的过程中我们只要接入LeakCanary则经常会收到DialogFragment导致内存泄露的小鸟惊喜。对于为什么DialogFragment会引起内存泄漏,网上资料一大堆,而且分析得也比较详尽,这里就不再多说了。

2023-02-17 14:01:29 589

原创 Opengl ES之踩坑记

最近在尝试使用Opengl ES实现一些LUT滤镜效果,在实现这些滤镜效果的时候遇到一些兼容性的坑,踩过这些坑后我希望把这几个坑分享给读者朋友们,希望同在学习Opengl ES的朋友们能少走弯路。

2023-02-15 10:30:43 485

原创 2022年终感悟-时光债务

首先说明一下,这可以算是我2022年的总结感悟,或许会有些许的负能量,介意的小伙伴建议直接关闭阅读。其实不是很想写年终总结,因为总感觉转眼间一年又过去,自己还是一事无成,除了打工还是打工,甚至如果倒霉遇上了,那么打工都变成了一中奢侈,也没什么可写的。后来想想无论过得如何,这都终将过去,成为自己生活中不可磨灭的一段过往,很应该被记录下来。

2023-01-16 14:39:56 640

原创 Opengl ES之RGB转NV21

在上一篇理论文章中我们介绍了YUV到RGB之间转换的几种公式与一些优化算法,今天我们再来介绍一下RGB到YUV的转换,顺便使用Opengl ES做个实践,将一张RGB的图片通过Shader的方式转换YUV格式图,然后保存到本地。

2023-01-16 14:37:17 967

原创 Opengl ES之YUV数据渲染

YUV的格式比较多,我们今天就以YUV420SP为例,而YUV420SP又分为`NV12`和`NV21`两种,因此今天我们的主题就是如何使用Opengl ES对`NV12`和`NV21`数据进行渲染显示。

2022-11-23 11:06:21 3371 3

原创 Opengl ES之PBO

主要介绍PBO的使用,包括PBO上传纹理以及下载纹理等相关操作

2022-11-23 11:05:14 1598

原创 Camera应用开发进阶

通过学习这几个项目,相信进阶Camera应用开发完全不是问题,基本涵盖Camera应用开发的所有知识点,例如相机的3A操作、对焦、数码变焦、MediaCodec视频编码、Opengl ES数据预览等,更有在低版本手机上实现HDR。发现资料其实不少,但是相对比较零散,能搭配实战项目系统学习的就更少了,于是结合之前笔者学习Camera的一些经验和研究过的几个开源项目,笔者整理了几个入门甚至进阶Camera应用开发的项目。针对读者的这个期望,笔者查了下网上关于Camera开发的相关资料,功能的demo效果等等。

2022-11-02 09:56:30 192

原创 分享几个关于Camera的坑

最近忙于开发一款基于Camera2 API的相机应用,部分功能涉及到广角镜头,因此踩了不少坑,在此与大家分享下以作记录交流…

2022-10-26 10:00:31 424

原创 Opengl ES之FBO

FBO帧缓冲对象,它的主要作用一般就是用作离屏渲染,例如做Camera相机图像采集进行后期处理时就可能会用到FBO。

2022-09-29 09:52:05 1201

原创 Opengl ES之EBO

前面我们介绍了VBO与VAO等缓冲对象,今天我们来介绍一下EBO。

2022-09-27 10:01:49 376

原创 Opengl ES之纹理贴图

纹理可以理解为一个二维数组,它可以存储大量的数据,这些数据可以发送到着色器上。一般情况下我们所说的纹理是表示一副2D图,此时纹理存储的数据就是这个图的像素数据。所谓的纹理贴图,就是使用Opengl将这个纹理数据渲染出来,这个过程有点像装修工人给墙体贴瓷砖,而瓷砖好比作纹理。

2022-09-23 10:05:29 1426

原创 Opengl ES之VBO和VAO

本文主要介绍了什么是VBO/VAO,为什么需要使用VBO/VAO以及如何使用VBO和VAO。

2022-09-23 10:04:21 626

原创 Opegnl ES之四边形绘制

Opengl ES实战-四边形绘制

2022-09-07 10:28:42 1414

原创 Opengl ES之三角形绘制

Opengl ES实战-三角形绘制

2022-09-07 10:27:45 1523 2

原创 Opengl ES之着色器

Opengl ES之着色器

2022-09-07 10:26:33 1017

原创 OpenglEs之EGL环境搭建

Opengl ES开篇之EGL简介

2022-09-07 10:20:13 1514

原创 FFmpeg之硬解码

导读前面我们已经使用NDK编译出了FFmpeg并且已经集成到了Android Studio中去,相关文章:NDK21编译ffmpeg5.0.1众所周知,软解码虽然兼容性一流,但是却非常依赖CPU,所以性能消耗笔记大;硬解码使用内置的DSP芯片进行解码,性能高,但是兼容性一般。虽说硬解码兼容性不太好,但是在实际开发中出于对性能的考虑我们依然会采用能硬解则硬解,不能硬解则软解兜底的方案。我们知道安卓上可以使用MediaCodec进行硬解码,新版本FFmpeg内部也支持了MediaCodec硬解码,今天我

2022-04-29 20:40:33 7557

原创 NDK21编译ffmpeg5.0.1

导读对于想要学习音视频开发的android开发者来说,使用NDK对FFmpeg进行交叉编译是一道必须迈过去的坎,网上关于使用NDK对FFmpeg进行交叉编译的教程有很多,但是不经修改能顺利编译通过的比较少。其实参照网上的教程不能编译通过很多时候不是人家的教程写的有问题,很多时候更多的是因为环境的差异导致了编译出错,而对于一个入门者来说编译报错了自己却不知道怎么改。如果对交叉编译不太了解的童鞋们可以参考我之前写的文章:音视频学习之NDK交叉编译基础NDK编译FFmpeg今天我们来使用NDK对FFm

2022-04-29 20:39:58 3291

原创 C++之虚函数

都说面向对象的三大特性是封装、继承、多态。C++作为一门面向对象编程语言,肯定也是具备了面向对象的三大特性,那么在C++中是如何实现多态的呢?在C++中是通过虚函数动态绑定的方式实现多态的。虚函数与纯虚函数首先我们来回顾一下虚函数,在C++中是使用virtual关键字修饰的函数就是虚函数,下面是一个简单的虚函数例子:class Base{public: // 虚函数,必须实现,否则编译报错 virtual void f1() const{ std::cout &lt

2022-04-29 20:39:17 3067

原创 ffplay音视频同步

前言对于音视频同步是有三种方案的,一种是以外部时钟为基准,音频时钟和视频时钟在播放时都以外部时钟为参考系,谁快了就等待,慢了就丢帧;第二种是以视频时钟为基准,音频时钟在播放的过程中参考视频时钟;第三种是以音频时钟为基准,视频时钟在播放的过程中参考音频时钟。由于人体器官对视觉的敏感读没有听觉的灵敏度高,因此为了更好的体验,在音视频同步时一般都是以音频时钟为基准的方案。那是不是说其他两种方案没有用处呢?也不是的,比如说一个只有视频没有音频的的视频文件,在播放的时候就需要以视频为基准了。今天介绍的音视频

2022-04-27 23:48:08 861

原创 ffplay音视频解码线程

前面我们介绍了ffplay的调试环境集成、ffplay总体架构、ffplay的读取线程等相关内容,今天介绍下ffplay解码线程工作流程。因为视频解码和音频解码的过程大概一致,因此本文主要介绍视频的解码线程内容,字幕的解码忽略…我们还是从这张图开始:图导出的可能有点模糊,再加上上传图床后不知道有没有更加模糊了,想要高清大图的可以后台留言,加v信索取。从图中可以看出,解码线程的主要工作内容是将资源包从待解码队列中取出,然后送进解码器,最后将解码出的数据帧放入帧队列中,等待SDL获取播放。解码过程

2022-04-27 23:46:47 1590

原创 ffplay数据读取线程

在前面我们介绍了ffplay的总体架构和一些关键的数据结构。今天我们还是从这张图开始,主要介绍ffplay的读取线程部分。图导出的可能有点模糊,再加上上传图床后不知道有没有更加模糊了,想要高清大图的可以后台留言,加v信索取。从ffplay的main函数入口开始阅读源码,发现是在函数stream_open创建了资源读取线程,读取线程执行的函数是read_thread,所以要分析读取线程的工作内容,我们只需读懂函数read_thread即可。下面是我加了注释的read_thread函数:/** *

2022-04-27 23:46:11 489

原创 ffplay整体框架

前言虽说ffplay是一个简单的播放器,但是其实内部一点也不简单,其实笔者也不知道说它简单的理由是什么,是因为它只有一个点c文件???ffplay内部细节繁多,想要深入分析不单单要掌握音视频的相关概念,还要掌握多线程等相关知识,但是不得不说ffplay确实是学习的播放器开发的一个最佳例子。建议想要学习ffplay的童鞋们集成后边阅读边增加注释,多阅读几次,相信你每次阅读都会有不同的理解与收获…本文使用的ffplay.c的版本是搭配ffmpeg5.0的版本。ffplay代码大致架构关于fplay的

2022-04-24 23:58:34 572

原创 ffplay调试环境搭建

前言ffplay是基于FFmpeg的最简单的官方播放器。麻雀虽小,五脏俱全,虽说ffplay简单,但是各种播放器应有的功能一一俱全,说它简单或许仅仅是因为它只有一个点c文件而已吧。想要开发一个优秀的播放器,参考是必不可少的,毕竟control c和control v是程序员天生的本能。以前遇到播放的问题向人请教的时,经常听到的一句话就是去看看ffplay是怎么处理的就知道怎么过解决了呀,可见ffplay在播放领域的地位不一般。。。而且想要学好FFmpeg,在了解了FFmpeg的基本知识和相关API之

2022-04-24 23:57:56 604

原创 FFmpeg连载8-视频合并以及替换视频背景音乐实战

前言通过前面的实战,我们实现音视频解封装提取、音视频解码、音视频编码、音频重采样等的功能,今天我们就结合之前所做的功能,来做一个短视频APP中常见的功能:1、提取多个mp3文件中的音频,重新编码为合并为aac2、提取mp4中的视频,重新编码合并为h2643、h264与aac合并成新的mp4文件因为我们的目的是以实战为主,为了囊括之前所学的一些知识点,在这个实战中我们不仅仅需要实现音视频解封装提取、音视频解码、音视频编码、音频重采样这些功能,我们还需要结合多线程同步等知识点做好生产者消费者队

2022-04-24 23:57:20 1242

原创 FFmpeg连载7-mp3转码aac及AVAudioFifo的使用

前言如今以抖音、快手为代表的短视频秀无处不在,比如它们一个很普通的功能就是使用流行音乐替换作为视频的背景音乐。而在视频中音频一般都是以AAC的形成存在,但流行音乐大多以mp3的格式传播,因此需要完成背景音乐替换这个功能,其中的一个步骤就需要完成mp3转aac这样的一个音频转转码的过程。按照我们以往的经验,转码的大致流程应该是这样的:解封装->提取音频流->解码成PCM->重新编码成AAC流程是这样没错,但是内部的出来细节是怎样的呢?是mp3解码出来后的AVFrame可以通过函

2022-04-24 23:56:46 826 2

原创 FFmpeg连载6-音频重采样

今天我们的实战内容是将音频解码成PCM,并将PCM重采样成特定的采样率,然后输出到本地文件进行播放。什么是重采样所谓重采样,一句话总结就是改变音频的三元素,也就是通过重采样改变音频的采样率、采样格式或者声道数。例如音频A是采样率48000hz、采样格式为f32le、声道数为1,通过重采样可以将音频A的采样率变更为采样率44100hz、采样格式为s16le、声道数为2等。为什么需要重采样一般进行重采样有两个原因,一是播放设备需要,二是音频合并、或编码器等需要。例如有些声音设备只能播放44100hz

2022-04-24 23:56:09 1939

原创 FFmpeg连载5-音视频编码

导读在前面的我们使用FFmpeg进行相关实践,对音视视频进行了解封装、解码等相关操作,今天我们继续使用FFmpeg进行实践,使用FFmpeg进行音视频编码。任务一:在前面《FFmpeg连载4-音频解码》我们将音频解码成PCM并输出到本地文件,今天我们就把这个输出到本地的PCM文件进行读取重新编码成AAC音频文件并输出到本地。任务二:在《FFmpeg连载3-视频解码》一节中我们将视频解码成YUV并且输出到本地文件,今天我们读取这个输出的YUV本地文件进行重新编码成H264视频文件并输出到本地。H2

2022-04-24 23:55:37 699

原创 FFmpeg连载4-音频解码

导读前面我们介绍了使用FFmpeg解码视频,今天我们使用FFmpeg解码音频。我们的目标将mp4中的音频文件解码成PCM数据,并输出到本地文件,然后使用ffplay播放验证。音频的解码过程就是将经过压缩后的数据重新还原成原始的PCM声音信号的过程。对于音频解码所用到的API和视频解码是一样的。PCM基础知识PCM是指未经过压缩的原始声音脉冲信号数据,它主要通过采样率、采样格式(比如每个采样点是8位、16位、32位等)、声道数来描述。在FFmpeg中有两种表示PCM数据包的模式,分别是planer和

2022-04-24 23:54:34 730 1

原创 FFmpeg连载3-视频解码

导读在前面我们介绍了FFmpeg的解封装,并且实现了提取视频文件中的音频流和视频流单独输出,使用ffplay播放验证,今天我们使用FFmpeg解码视频流,将视频解码为YUV并输出到文件,然后使用ffplay播放YUV图像。关于YUV的相关知识,之前笔者也有过一些笔记,但是写的比较简单,大家可以网上找找更加详细的资料:音视频基础知识-YUV图像关于使用FFmpeg进行视频解码的文章,之前也写过类似的文章《Android使用ffmpeg解码视频为YUV》但是在这篇文章中有一个错误的点就是写入的YUV

2022-04-21 00:32:09 447

原创 FFmpeg连载2-分离视频和音频

前言前面我们搭建好了FFmpeg的开发环境,今天我们就来小试牛刀,使用FFmpeg库对mp4文件进行解封装,提取mp4中的视频流和音频流输出到单独的输出文件中。关于FFmpeg开发环境搭建可以看我之前的文章:FFmpeg连载1-开发环境搭建所谓的分离视频和音频是我们通俗的说法,官方的说法叫解封装。与解封装对应的叫封装或复用器,也就是将多个视频流或音频流合并成一个多媒体文件就叫封装。API及数据结构介绍在FFmpeg中解封装的大致流程如下图所示:在这里需要注意的一个点是av_find_best_

2022-04-21 00:31:13 1740

原创 FFmpeg连载1-环境搭建

前言之前笔者从事安卓开发的时候想要学习音视频实践,脑子里面想的是要是有专门针对安卓开发的FFmpeg教程就好了。慢慢地发现这个想法很不靠谱,因为那时关于音视频的相关教程本来就少,如果还要是针对安卓的就凤毛麟角了。后来为了学习FFmpeg,笔者也是断断续续的,从音视频的基础资料开始,从FFmpeg编译到实践,希望通过自己的学习可以一点一点地揭开FFmpeg的神秘面纱,直到今天笔者只敢说仅是音视频开发大军中的一个入门新手而已,虽说自己摸索挺久,但依旧难以进阶,我想其中有两个主要的原因,一是缺少仙人指路,二

2022-04-21 00:30:30 558

原创 JNI之常见技巧与陷阱

预告后续可能会推更一个FFmpeg系列的入门博客,大概涉及到FFmpeg解封装、FFmpeg编解码、FFmpeg进行音频重采样、使用FFMpeg将mp3转码成aac、使用FFmpeg合并拼接音视频等。另外如果有时间可能也会更新几篇关于ffplay的文章,敬请关注。本文将作为JNI系列的一个结尾,下面是笔者在学习使用JNI的所记录的一些笔记与技巧。JNIEnv的线程限制一个JNIEnv指针仅在其相关联的线程中有效。你不能将这个指针从一个线程中传递给另一个线程,或者在多线程中缓存和使用它。Java虚拟

2022-04-16 12:11:56 887

原创 JNI异常处理

前言本文所要介绍的异常处理是指通过JNI调用java层方法时产生的异常处理,并不是指JNI调用Native层函数时产生的异常处理,如果童鞋们想要了解Native层的异常处理可以参考笔者之前的文章《C++之异常处理》按照java的经验,当发生异常而又没有捕获时,异常后面的代码就得不到继续执行的机会,但是在JNI中不同,在JNI中如果调用java层的方法抛出了异常,依然会继续往后执行,但是这些行为往往会带来各种各样的"惊喜"。。。因此我们需要在异常发生时将这些异常及时进行处理。本文主要从捕获java层异常

2022-04-16 12:11:13 2983

空空如也

空空如也

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

TA关注的人

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