NDK
文章平均质量分 50
sziitjin
安卓App开发工程师
展开
-
NDK OpenGL实现美颜功能
3)相机绘制一帧图像时,会回调到自定义渲染器MyGlRendere的onDrawFrame()函数,获取纹理对象的图像数据,先通过CamreaFilter相机过滤器,实现相关效果,再将其FBO的纹理ID传递给大眼过滤器BigEyeFilter,大眼过滤器增加完特效后,再将包含大眼特效的纹理ID传递给美颜过滤器BeautyFilter,美颜过滤器增加完特效后,将包含美颜特效的纹理ID,传递给ScreenFilter屏幕过滤器,将最终成果的纹理ID通过OpenGL渲染到屏幕;2.编写美颜片元着色器代码;原创 2023-07-16 15:47:59 · 350 阅读 · 0 评论 -
NDK OpenGL与OpenCV实现大眼萌特效
3)相机绘制一帧图像时,会回调到自定义渲染器MyGlRendere的onDrawFrame()函数,获取纹理对象的图像数据,先通过CamreaFilter相机过滤器,实现相关效果,再将其FBO的纹理ID传递给大眼过滤器BigEyeFilter,大眼过滤器增加完特效后,又将包含大眼特效的纹理ID,传递给ScreenFilter屏幕过滤器,将最终成果的纹理ID通过OpenGL渲染到屏幕;2)创建Java层FaceTrack.java人脸追踪类,人脸与关键点的定位追踪 api 类, 与C++层交互。原创 2023-07-16 15:07:38 · 631 阅读 · 0 评论 -
NDK OpenGL仿抖音极快极慢录制特效视频
3)录制我们在另外一个线程中进行(录制线程),所以录制的EGL环境和显示的EGL环境(GLSurfaceView,显示线程)是两个独立的工作环境,他们又能够共享上下文资源:显示线程中使用的texture等,需要能够在录制线程中操作 (通过录制线程中使用OpenGL绘制到MediaCodec的Surface)。以上接口创建一个Surface,然后我们在这个Surface中作画(输入源的直接绑定),MediaCodec就能够自动的编码Surface中的画作,我们只需要从输出缓冲区取出编码完成之后的数据。原创 2023-05-17 00:38:47 · 450 阅读 · 0 评论 -
NDK OpenGL离屏渲染与工程代码整合
3)绘制一帧图像时,回调onDrawFrame()函数,获取纹理对象的图像数据,先通过CamreaFilter相机过滤器,实现相关效果,再将其FBO的纹理ID传递给下一个过滤器,这里由于暂无实现其他特效,就传递给了ScreenFilter屏幕过滤器,将最终成果的纹理ID通过OpenGL渲染到屏幕;2.编写CamreaFilter相机过滤器,实现FBO离屏渲染和变换矩阵等相机相关操作,绘制操作完成后,将相机过滤器实现的效果的纹理ID传递给下一个过滤器,在相机过滤器效果上进行叠加其他效果。原创 2023-05-11 00:27:51 · 631 阅读 · 0 评论 -
NDK OpenGL渲染画面效果
针对手机、PDA和游戏主机等嵌入式设备而设计的OpenGL API 子集, GLSurfaceView(不仅仅有,SurfaceView的所有功能,还拥有了 OpenGL的处理)。系列之OpenGL渲染画面效果技术实战,本节主要是通过OpenGL Java库(谷歌对OpenGL C++库做了JIN封装,核心实现还是在Native层),实现页面渲染,自定义渲染特效。设置纹理坐标,用来图形上色;3)绘制一帧图像时,回调onDrawFrame()函数,获取纹理对象的图像数据,通过OpenGL渲染到屏幕;原创 2023-04-27 00:02:43 · 804 阅读 · 0 评论 -
NDK OpenCV人脸定位
NDK系列之OpenCV人脸定位技术实战,本节主要是通过OpenCV C++库,实现识别人脸定位,并对识别到的人脸画面增加红框显示。5)通过中转站FaceTracker,实例化Native层播放窗口ANativeWindow,关联surfaceView;2)初始化人脸跟踪中转站FaceTracker,将人脸识别训练数据路径传递到Native层;7.获取相机数据,传递Native层,人脸定位,绘制人脸框,渲染画面到屏幕。6)获取相机数据,传递Native层,人脸定位,绘制人脸框,渲染画面到屏幕。原创 2023-04-22 22:43:16 · 1709 阅读 · 1 评论 -
NDK OpenCV 身份证信息离线识别
NDK系列之OpenCV 身份证信息离线识别技术实战,本节主要是通过OpenCV C++库,实现身份证信息识别,如身份证号码识别,本节使用到的技术点同样适用于车牌号识别、银行卡号码识别等。5)膨胀,发酵,Native层目的是查找身份证号码区域,从身份证图中可以看出,身份证号码区域是一块有间隔连续的号码区域;将Java层获取到的选择的身份证图片的Bitmap,即fullImage变量,传给Native层,通过OpenCV库,将身份证图片中的身份证号码区域找到,并裁剪出来;4)二值化,再一步过滤,降噪;原创 2023-04-18 11:36:28 · 793 阅读 · 0 评论 -
NDK RTMP直播客户端三
开始直播,修改标记 让其可以进入while 完成音频数据推送, 并开启子线程,子线程:AudioRecord采集录制音频数据,再把此数据传递给 --> native层(进行编码) --> 封包(RTMPPacket) --> 发送。1)初始化AudioChannel音频通道,并设置 AudioRecord采集录制音频数据推送到native层,audioChannel编码后数据,通过callback回调到native-lib.cpp,加入队列;简单的说,就是将手机采集的音频数据和视频数据,推到服务器端。原创 2023-04-13 22:28:37 · 626 阅读 · 0 评论 -
NDK RTMP直播客户端二
NdkPusher构造函数调用到这里,初始化native层VideoChannel,设置 Camera预览画面的数据推送到native层,videoChannel编码后数据,通过callback回调到native-lib.cpp,加入队列。分发到VideoChannel视频通道初始化编码器。Camera预览画面的数据,回调到这里,将原始数据进行x264编码后,得到的RTMPPkt(压缩数据)加入队列里面。Camera预览画面的数据,回调到这里,再通过mNdkPusher,将数据推送到native层。原创 2023-04-10 01:24:03 · 352 阅读 · 0 评论 -
NDK RTMP直播客户端一
在之前完成的实战项目【FFmpeg音视频播放器】属于拉流范畴,接下来将完成推流工作,通过RTMP实现推流,即直播客户端。类比HTTP中的OkHttp库,RtmpDump在RTMP协议中,类似OkHttp的角色。它能够单独使用进行RTMP的通信,也可以集成到FFmpeg中通过FFmpeg接口来使用RTMPDump。音频:AudioRecord-->封装(压缩)--->rtmp包--->发送服务器。视频:Camera采集-->封装(压缩)--->rtmp包--->发送服务器。准备工作完成,下一节开始推流工作。原创 2023-04-05 22:58:00 · 380 阅读 · 0 评论 -
NDK FFmpeg音视频播放器六
一二三四五节已经实现了音视频的播放器功能,本节主要是对音视频播放器增加拖动条功能,以及项目的一些释放工作。Native层native-lib.cpp调用NdkPlayer.cpp获取播放总时长。将拖动条% 转化成视频播放的时间戳,传给native层,并设置为视频的播放时间。2)获取视频播放时间戳,实时同步到UI更新当前播放时间和拖动条进度;通过NdkPlayer.java调用Native层获取播放总时长。3)手指拖动拖动条,视频播放到拖动条对应的时间的画面。1)获取视频播放总时长,并显示总时长和拖动条;原创 2023-04-02 00:03:55 · 392 阅读 · 0 评论 -
NDK FFmpeg音视频播放器五
在FFmpeg里面播放时间有自己的单位(时间基TimeBase),可以理解为:例如:(fps25 一秒钟25帧, 那么每一帧==25分之1,而25分之1就是时间基概念),需要将TimeBase转换为时间戳。3.如果视频播放的时间搓 > 音频播放的时间搓,视频播放快,需要等待音频播放,视频播放休眠。4.如果视频播放的时间搓 < 音频播放的时间搓,视频播放慢,需要追赶音频播放,视频播放丢包。3)自己算出一个播放时间为准,维护音频,维护视频,维护自己算法的时间,做同步(不推荐)2.获取视频播放的时间搓。原创 2023-03-29 23:59:11 · 267 阅读 · 0 评论 -
NDK FFmpeg音视频播放器四
通过Profiler可以清楚的看出,视频在播放时,native层消耗的内存不断增加,最终达到1.5G,java层内存几乎没有变化,可以直观的分析出native层存在严重的内存泄漏问题。问题1:循环中存在明显的生产者生产速度远大于,消费者的消费速度,导致队列撑爆,段时间内存急速增到;音视频一二三节已经实现了音视频播放,本节主要是通过Profiler来检测工程存在的内存泄漏问题。内存平稳,保持在177M左右,基本解决内存泄漏问题,接下来。优化方案:放慢生产速度,等待消费者将队列数据消费差不多再生产。原创 2023-03-27 23:41:08 · 429 阅读 · 0 评论 -
NDK FFmpeg音视频播放器三
该库都允许使用C或C++来实现高性能,低延迟的音频操作。PCM是不能直接播放,mp3可以直接播放(参数集),PCM无参数集,需要手动设置参数。音视频一和二节已经实现了视频播放,本文主要是通过OpenSLES来完成音频的播放。第一个线程:取出队列的音频压缩包,进行解码,解码后得到原始包,再push队列中去;第二线线程:从队列取出音频原始包,播放(通过OpenSLES完成播放工作)。音频的播放流程跟第二节的视频解码播放流程基本一致,创建两个线程,音视频--音频和视频解码与播放渲染功能完成,接下来。原创 2023-03-26 00:08:14 · 318 阅读 · 0 评论 -
NDK FFmpeg音视频播放器二
6.音频和视频都有相同的解压、原始包、播放动作,故创建分别创建音频和视频队列,并封装到音频AudioChannel通道和视频VideoChannel通道中去处理;封装线程安全队列SafeQueue,通过pthread_mutex_t互斥锁和pthread_cond_t条件变量来实现数据入队,出队,等待和唤醒工作。4.创建循环去AVPacket队列中获取压缩包AVPacket,解压得到原始包AVFrame,并push原始包到AVFrame队列;3.拿到音视频原始包AVFrame,进行播放。原创 2023-03-23 01:15:02 · 345 阅读 · 0 评论 -
NDK FFmpeg音视频播放器一
音视频的准备播放工作主要放在NdkPlayer.class中实现,MainActivity主要作用在于各生命周期触发时,调用NdkPlayer.class去实现功能。NDK前期基础知识终于学完了,现在开始进入项目实战学习,通过FFmpeg实现一个简单的音视频播放器。实现Native层与Java层的通讯,通过jni反射调用Java层的方法。NdkPlayer.cpp的头文件,主要作用:导包,声明函数和成员属性。Java层调用的Native层方法在native-lib.cpp编写。原创 2023-03-19 17:05:41 · 821 阅读 · 0 评论 -
NDK Cmake原生构建
CMake并不直接构建出最终的软件,而是产生其他工具的脚本(如makefile),然后再依据这个工具的构建方式使用。CMake是一个比make更高级的编译配置工具,它可以根据不同的平台、不同的编译器,生成相应的makefile或vcproj项目,从而达到跨平台的目的。早期时使用的是Makefile构建代码;CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。ninja是一个小型的关注速度的构建系统。CMake其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。原创 2023-03-18 17:45:19 · 109 阅读 · 0 评论 -
NDK Linux命令、VIM、Shell脚本
Linux命令、VIM、Shell脚本原创 2023-03-14 20:41:29 · 240 阅读 · 0 评论 -
NDK JNI JavaVM、JNIEnv和jobject的理解
JavaVM、JNIEnv和jobject的理解原创 2023-03-12 13:21:45 · 489 阅读 · 0 评论 -
NDK JNI 函数的静态注册与动态注册
静态注册native方法。动态注册native方法。原创 2023-03-12 12:22:05 · 299 阅读 · 0 评论 -
NDK JNI 变声器实现
通过使用fmod的C库,实现变声器功能。原创 2023-03-09 00:41:51 · 898 阅读 · 0 评论 -
NDK JNI C++层玩转Java层对象
C++层玩转Java层对象。原创 2023-03-07 00:07:42 · 171 阅读 · 0 评论 -
NDK JNI JNI的交互
NDK JNI JNI的交互。原创 2023-03-05 21:20:50 · 67 阅读 · 0 评论 -
NDK C++ map容器
NDK C++ map容器。原创 2023-03-02 23:03:38 · 246 阅读 · 0 评论 -
NDK C++ set容器 和 函数谓词
set容器 和 函数谓词。原创 2023-03-01 00:58:47 · 53 阅读 · 0 评论 -
NDK C++ stack(栈)和 queue(队列)
stack(栈)和 queue(队列)原创 2023-03-01 00:36:22 · 106 阅读 · 0 评论 -
NDK C++ vector(向量)和 list
vector(向量)和 list。原创 2023-02-28 23:44:43 · 106 阅读 · 0 评论 -
NDK C++ 全纯虚函数的应用 -- 回调功能
全纯虚函数(类似Java接口)的应用 -- 回调功能。原创 2023-02-27 01:28:27 · 109 阅读 · 0 评论 -
NDK C++ 纯虚函数(Java抽象类)和 全纯虚函数(Java接口)
纯虚函数(Java抽象类)和 全纯虚函数(Java接口)原创 2023-02-27 01:18:33 · 168 阅读 · 1 评论 -
NDK C++ 模版函数(类似Java泛型)
模版函数(类似Java泛型)原创 2023-02-27 00:53:24 · 66 阅读 · 0 评论 -
NDK C++ 多态:重写 和 重载
多态:重写 和 重载。原创 2023-02-27 00:44:56 · 75 阅读 · 0 评论 -
NDK C++ 属性初始化和虚继承
NDK C++ 属性初始化和虚继承。原创 2023-02-27 00:21:00 · 54 阅读 · 0 评论 -
NDK C++ 面向对象继承与操作符重载
面向对象继承与操作符重载。原创 2023-02-25 23:11:44 · 59 阅读 · 0 评论 -
NDK C++ 函数与友元函数/友元类
函数与友元函数/友元类。原创 2023-02-24 01:11:05 · 72 阅读 · 0 评论 -
NDK C++ 指针常量 常量指针 常量指针常量
指针常量 常量指针 常量指针常量。原创 2023-02-23 23:03:38 · 188 阅读 · 0 评论 -
NDK C++ 浅拷贝与深拷贝的原理
浅拷贝与深拷贝的原理。原创 2023-02-23 22:58:28 · 59 阅读 · 0 评论 -
NDK C++ 构造函数与拷贝构造函数
构造函数与拷贝构造函数。原创 2023-02-22 01:04:56 · 68 阅读 · 0 评论 -
NDK C++ 面向对象
Student.cpp 实现文件。Student.h 头文件。原创 2023-02-21 01:02:31 · 78 阅读 · 0 评论 -
NDK C++ 引用与常量引用
NDK C++ 引用与常量引用。原创 2023-02-21 00:41:55 · 53 阅读 · 0 评论 -
NDK C语言 文件的加解密
NDK C语言 文件的加解密。原创 2023-02-20 00:04:04 · 119 阅读 · 0 评论