音视频
文章平均质量分 75
zouzhiheng
这个作者很懒,什么都没留下…
展开
-
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 · 1168 阅读 · 0 评论 -
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 · 3727 阅读 · 0 评论 -
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 · 1528 阅读 · 1 评论 -
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 · 1823 阅读 · 0 评论 -
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 · 2016 阅读 · 3 评论 -
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 · 3432 阅读 · 1 评论 -
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 · 123627 阅读 · 0 评论 -
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 · 3173 阅读 · 0 评论 -
FFmpeg 是如何实现多态的?
前言众所周知,FFmpeg 在解码的时候,无论输入文件是 MP4 文件还是 FLV 文件,或者其它文件格式,都能正确解封装、解码,而代码不需要针对不同的格式做出任何改变,这是面向对象中很常见的多态特性,但 FFmpeg 是用 C 语言编写的,那么它是如何使用 C 语言实现了多态特性的呢?要解决这个问题,首先需要从函数 av_register_all 说起。av_register_allav...原创 2018-10-09 22:32:14 · 373 阅读 · 0 评论 -
OpenGL ES 3.0(一)绘制第一个三角形
OpenGL 概述绘制三角形之前,需要对 OpenGL 有一个大致的了解,因此这里引用了 learnopengl-cn.github.io 里的内容:OpenGL 一般被认为是一个API,然而并不是,OpenGL 仅仅是一个由 Khronos 组织制定并维护的规范。OpenGL 规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现的,将由 OpenGL 库的开...原创 2018-08-07 22:42:32 · 3242 阅读 · 0 评论 -
OpenGL ES 3.0(五)纹理
我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。因此,一般情况下会使用纹理达到相同的效果。纹理可以认为是一张可以贴到物体(图元)表面上的图片/花纹/贴纸,使物体(图元)变得生动、精细。生成纹理对象、绑定并加...原创 2018-08-11 22:12:37 · 1510 阅读 · 0 评论 -
使用 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 · 2111 阅读 · 0 评论 -
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 · 6410 阅读 · 0 评论 -
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 · 1756 阅读 · 0 评论 -
MediaCodec、AudioRecord 硬件编码录制视频
无论是解码、转码、编码,MediaCodec 的使用流程基本都是一致的,因此话不多说,直接上代码:public class HWRecordActivity extends BaseActivity implements View.OnClickListener, Camera.PreviewCallback, SurfaceHolder.Callback { pri...原创 2018-07-15 15:45:24 · 1491 阅读 · 0 评论 -
音视频开发基础概述 - PCM、YUV、H264、常用软件介绍
前言相对而言,音视频开发应该算门槛稍高的,记得我刚开始学习的时候,看别人的博客几乎都看不懂。后来总结了一下,看不懂的原因是没有掌握相关基础知识,比如一些概念(码率、采样率、帧率等),音视频中的颜色格式(RGB、YUV)、音频格式(PCM)等,写代码之前不了解这些,会写得非常痛苦——因为你不知道为什么要这么写,也不知道写出来的效果是怎样的。基础概念声波声波有三要素:1) 频率,代...原创 2018-07-28 00:56:56 · 9762 阅读 · 2 评论 -
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 · 1194 阅读 · 0 评论 -
OpenGL ES 3.0(三)EGL 概述
OpenGL ES 定义了一个渲染图形的规范,但没有定义窗口系统。为了让 GLES 能够适合各种平台,GLES 将与知道如何通过操作系统创建和访问窗口的库,即 EGL 结合使用。在使用 GLES 进行任何操作之前,必须先创建一个 OpenGL 上下文,这是通过 EGL 实现的。EGL 提供了以下机制: 1) 和设备的本地窗口系统通信 2) 查询绘图表面的可用类型及配置 ...原创 2018-08-11 21:53:22 · 4421 阅读 · 0 评论 -
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 · 1179 阅读 · 0 评论 -
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 · 9536 阅读 · 2 评论