自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 问答 (3)
  • 收藏
  • 关注

原创 为什么 bindService 能和 Activity 的生命周期联动?

前言之前做一道面试题:startService 和 bindService 有什么不同?为什么 bindService 能和 Activity 的生命周期联动?前一个问题可以很快回答出来:生命周期不同,结束方式不同,交互方式不同。后一个问题也能很快想到应该是 Activity 在销毁的时候顺带把 Service 销毁了。那么为什么 startService 不行呢?具体是怎么实现的呢?如果不...

2018-12-14 23:41:18 753

原创 从Zygote说到View(一)Zygote的启动流程及运行机制

前言计划写一个系列文章,从 Zygote 开始,说到 Activity,再到 View 的显示及事件分发等,意在把 Android 开发中最核心的一些的知识点串成线,看看 Android 是怎么把它们组织到一起的,希望能写好。本文是第一篇,以“Zygote 的启动流程及运行机制”为题, 将打通“虚拟机-Zygote-应用进程-ActivityThread”这一条线。Zygote 的中文意思是...

2018-12-04 00:06:47 633

原创 Android 面试题整理总结(三)Java 并发

零、目录一、并发基础1、Java 有哪几种创建新线程的方法及区别?销毁一个线程的方法呢?2、线程的生命周期?3、Thread 的 join 有什么作用?4、sleep 和 wait 的区别?5、多线程的使用场景?为什么要使用多线程?多线程需要注意的问题?(上下文开销、死锁等)6、多线程是否一定会高效?关于并发理解多少?7、Java 多线程之间如何通信?除了 notify 还有什么别...

2018-12-01 22:21:50 886

原创 Android 面试题整理总结(二)Java 集合

目录1、Java集合框架中有哪些类?都有什么特点?区别是什么?2、集合、数组、泛型的关系和区别?3、HashMap 相关:3.1 解释一下 HashMap,Java为什么要推出 HashMap?3.2 底层实现了什么数据结构?3.3 put、get 元素的过程?体现了什么数据结构?3.4 HashMap 是有序的吗?如何实现有序?3.5 是采用什么方法处理冲突的?分离链接法的优缺点...

2018-12-01 22:19:51 405

原创 Android 面试题整理总结(一)Java 基础

目录1、final 修饰一个对象,能否调用对象修改属性的方法?2、fina l和 static关键字的区别?3、static 修饰的方法可以被子类重写吗?为什么?4、final、finally、finalize 分别表示什么含义?5、抽象类能否实例化,理论依据是什么?6、抽象类跟接口的区别,接口的默认修饰符?7、面向对象编程的特点,多态性如何体现,Java虚拟机中的多态执行机制?8...

2018-12-01 22:18:02 966

原创 RecyclerView 源码深入解析——绘制流程、缓存机制、动画等

前言本文打算对 RecyclerView 做一个详细完整的、重点突出的分析与总结,因为 RecycelrView 源码很长(光 RecyclerView 文件本身就有 13000+ 行),因此文章也会很长,但一通分析下来后会发现,RecyclerView 虽然是 ListView 的加强版,除了在使用方法上类似之外,关键源码上也是非常类似的。RecyclerView 的使用可以参考大神的文章:...

2018-11-10 16:04:00 805

原创 FFmpeg 新旧版本编码 API 的区别

前言FFmpeg 3.x 之前,视频编码函数为 avcodec_encode_video2,3.x 及之后的版本,avcodec_encode_video2 被弃用,取而代之的是 avcodec_send_frame() 和 avcodec_receive_packet(),下面将从 API 的使用和源码实现两个角度来分析它们的区别。API 的使用旧版 API下面摘抄了 ffmpeg 转码...

2018-10-14 13:57:10 3058

原创 FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame

使用从 FFmpeg 3.x 开始,avcodec_decode_video2 就被废弃了,取而代之的是 avcodec_send_packet 和 avcodec_receive_frame。使用方法很简单,可以查看 ffmpeg 源码文件夹 ffmpeg-< version>/doc/example/decode_video.c 下的代码,这里摘抄关键部分如下:static v...

2018-10-09 22:57:45 9448 2

原创 FFmpeg 是如何实现多态的?

前言众所周知,FFmpeg 在解码的时候,无论输入文件是 MP4 文件还是 FLV 文件,或者其它文件格式,都能正确解封装、解码,而代码不需要针对不同的格式做出任何改变,这是面向对象中很常见的多态特性,但 FFmpeg 是用 C 语言编写的,那么它是如何使用 C 语言实现了多态特性的呢?要解决这个问题,首先需要从函数 av_register_all 说起。av_register_allav...

2018-10-09 22:32:14 361

原创 原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变

相信大多学习过 Java 的都对 extends 和 super 产生过疑惑,特别是坑爹的 PECS 原则,又是英文缩写,又是消费者生产者的,如此抽象的结论,这是正常人应该记的吗?不吐槽,回归正题,网上有许多文章对 extends 和 super 进行过各种解析,基本都能得出如下类似的结论:extends 可用于的返回类型限定,不能用于参数类型限定。super 可用于参数类型限定,不...

2018-09-28 23:55:31 722

原创 Android 虚拟机简单介绍——ART、Dalvik、启动流程分析

Android 虚拟机方面的知识,我是通过《深入理解 Android 内核设计思想》来学习的,内容特别多(只有一章,但有 160 页),但感觉和 Android 开发有些偏了,因此很多内容都没有认真去看,比如 EFL 格式等,这里只是选取了一些感觉比较重要的做一个大致的简单的介绍。虚拟机基础知识Java VM详见《深入理解 Java 虚拟机》LLVMLLVM 全称是 Low Level ...

2018-09-24 16:38:25 6127

原创 FFmpeg 的介绍与使用

FFmpeg:Fast Forward Moving Picture Experts GroupFFmpeg 命令行工具的使用在 FFmpeg 官网 可以下载对应平台的可执行程序包,比如 Windows 平台的下载地址是:https://ffmpeg.zeranoe.com/builds/,下载解压后就能在 bin 文件夹下能看到三个可执行程序:ffmpeg、ffplay、ffprob...

2018-09-04 23:32:08 123261

原创 OpenGL ES 3.0(九)实现美颜相机功能

着色器代码虽然知道磨皮应该用双边滤波算法,但实际上我并不懂具体的代码编写过程,因此着色器代码用的是 GitHub 上找的一个项目:WSLiveDemo ,顶点着色器如下:#version 300 eslayout(location=0) in vec4 aPosition;layout(location=1) in vec4 aTexCoord;uniform mat4 mMat...

2018-09-02 00:07:23 3411 1

原创 OpenGL ES 3.0(八)实现带水印的相机预览功能

着色器代码这次准备在 Android 上实现一个带水印的相机预览功能,因此需要两个纹理,一个用于相机预览,一个用于显示水印,顶点着色器如下:#version 300 eslayout(location=0) in vec4 aPosition;layout(location=1) in vec4 aCameraTexCoord;layout(location=2) in vec4 ...

2018-09-01 23:34:40 1998 3

原创 OpenGL ES 3.0(七)图像处理概述

图像处理的基本原理亮度调节亮度调节有非线性、线性两种实现方式。非线性亮度调节的实现非常简单,伪代码如下:byte* image = loadImage();byte* r, g, b = interlaceImage(image);int brightness = 3;r += brightness;g += brightness;b += brightness;线性...

2018-09-01 23:04:02 1790

原创 MediaCodec、OpenGL、OpenSL/AudioTrack 实现一款简单的视频播放器

概述功能很简单,大致流程为: 1) MediaCodec 解码视频文件得到 YUV、PCM 数据 2) OpenGL 将 YUV 转为 RGB,并渲染到 Surface 上 3) OpenSL/AudoTrack 获取 PCM 数据并播放需要的前置知识有: 1) YUV、PCM 等基础音视频知识,如 YUV 转 RGB 2) MediaCodec 的使用 3) OpenGL,包...

2018-08-18 12:19:11 1515 1

原创 OpenGL ES 3.0(六)缓冲区对象、PBO、FBO

缓冲区缓冲区对象创建:Gluint pixBuffObjs[1];glGenBuffers(1, pixBuffObjs);绑定:glBindBuffer(GL_PIXEL_PACK_BUFFER, pixBuffObjs[0]);缓冲区对象的绑定点有: Target Name Description GL_ARRAY_BUFFER ...

2018-08-18 11:14:13 3682

原创 OpenGL ES 3.0(五)纹理

我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。因此,一般情况下会使用纹理达到相同的效果。纹理可以认为是一张可以贴到物体(图元)表面上的图片/花纹/贴纸,使物体(图元)变得生动、精细。生成纹理对象、绑定并加...

2018-08-11 22:12:37 1495

原创 OpenGL ES 3.0(四)图元、VBO、VAO

图元OpenGL ES 3.0 可供绘制的图元类型有: 1) Triangles,三角形 2) Lines,线 3) Point sprites,点三角形绘制三角形时,可供选择的绘制方式有:GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN 三种,效果如下:即:1) GL_TRIANGLES,共有 ...

2018-08-11 21:59:45 1166

原创 OpenGL ES 3.0(三)EGL 概述

OpenGL ES 定义了一个渲染图形的规范,但没有定义窗口系统。为了让 GLES 能够适合各种平台,GLES 将与知道如何通过操作系统创建和访问窗口的库,即 EGL 结合使用。在使用 GLES 进行任何操作之前,必须先创建一个 OpenGL 上下文,这是通过 EGL 实现的。EGL 提供了以下机制: 1) 和设备的本地窗口系统通信 2) 查询绘图表面的可用类型及配置 ...

2018-08-11 21:53:22 4398

原创 OpenGL ES 3.0(二)着色器语言

着色器版本指定#version 300 es如果没有指定,则默认为 1.00,这是 OpenGL ES 2.0 使用的版本,在 OpenGL ES 3.0 中,制定规范的作者决定匹配 OpenGL ES 和 ES SL 的版本,因此直接从 1.0 跳到了 3.0。变量类型 标量 float, int, uint, bool 基于标量的数据类型 浮点向量...

2018-08-11 21:41:14 1181

原创 OpenGL ES 3.0(一)绘制第一个三角形

OpenGL 概述绘制三角形之前,需要对 OpenGL 有一个大致的了解,因此这里引用了 learnopengl-cn.github.io 里的内容:OpenGL 一般被认为是一个API,然而并不是,OpenGL 仅仅是一个由 Khronos 组织制定并维护的规范。OpenGL 规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现的,将由 OpenGL 库的开...

2018-08-07 22:42:32 3211

原创 OpenSL ES 实现音频的录制与播放

前言网上关于 OpenSL ES 的资料似乎相当少,最好的学习办法似乎是抄写 googlesamples/android-ndk 里的代码示例。这里打算使用 OpenSL ES 实现三个功能: 1) 播放 MP3 文件 2) 播放 PCM 文件 3) 录制 PCM 文件其中第 2 个功能和第 1 个雷同,这篇博客里不会给出代码示例,需要的可以看 GitHub。OpenSL E...

2018-07-28 21:26:36 1152

原创 音视频开发基础概述 - PCM、YUV、H264、常用软件介绍

前言相对而言,音视频开发应该算门槛稍高的,记得我刚开始学习的时候,看别人的博客几乎都看不懂。后来总结了一下,看不懂的原因是没有掌握相关基础知识,比如一些概念(码率、采样率、帧率等),音视频中的颜色格式(RGB、YUV)、音频格式(PCM)等,写代码之前不了解这些,会写得非常痛苦——因为你不知道为什么要这么写,也不知道写出来的效果是怎样的。基础概念声波声波有三要素:1) 频率,代...

2018-07-28 00:56:56 9704 2

原创 MediaCodec、AudioRecord 硬件编码录制视频

无论是解码、转码、编码,MediaCodec 的使用流程基本都是一致的,因此话不多说,直接上代码:public class HWRecordActivity extends BaseActivity implements View.OnClickListener, Camera.PreviewCallback, SurfaceHolder.Callback { pri...

2018-07-15 15:45:24 1475

原创 MediaCodec 实现硬件转码

public class HWCodec { private static final String TAG = "HWCodec"; private static final long DEFAULT_TIMEOUT = 10 * 1000; private static final int MEDIA_TYPE_VIDEO = 1; private sta...

2018-07-15 15:35:44 1715

原创 MediaCodec 实现硬件解码

public class HWCodec { private static final String TAG = "HWCodec"; private static final long DEFAULT_TIMEOUT = 10 * 1000; private static final int MEDIA_TYPE_VIDEO = 1; p

2018-07-15 15:32:18 6365

原创 使用 AudioRecord 录制 PCM、WAV 文件,AudioTrack 播放 PCM 文件

音频采集:private class AudioRecorder { private ExecutorService mExecutor = Executors.newCachedThreadPool(); private AudioRecord mAudioRecord; private int mBufferSize; ...

2018-07-15 15:22:46 2089

原创 Android 使用 ImageView、SurfaceView、自定义 View 绘制图片(附源码简析)

打算根据 @卢俊 写的 音视频开发入门指南 写一个系列博客,这是第一篇,也是文章 音视频开发入门指南 任务列表中的第一个。ImageViewImageView 绘制图片就很简单了,无论是 xml 还是 Java 代码,都只需要设置一个属性即可。但我们可以看看 ImageView 的源码实现,来学习一下 ImageView 绘制图片的流程。直接看 onDraw() 即可: ...

2018-07-15 01:15:02 3653

空空如也

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

TA关注的人

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