音视频学习有好多文章,但是很多都是非常杂乱,整理了一下网上学习的比较有用的文章,学习思路可以按这个链接下来学习:

【Android 音视频开发打怪升级:音视频硬解码篇】一、音视频基础知识

整理的很到位,包括基础,OpenGL,ffmpeg。就是代码是 kotlin,可以花一天时间入个门,代码就能看懂。

实在看不懂的,可以按照他的目录作为学习思路,百度文章来看。

可以看上面文章中的概念,然后代码看下面的整理用 java 来学习音视频。

关于摄像头学习

参考这个,语言是java,这里面整理了一系列:

Camera开发系列之一 显示摄像头实时画面

关于OpenGL学习

热门专题 - OpenGL ES - 玩Android - wanandroid.com

里面有OpenGL的基础,OpenGL入门画三角形简单,面向过程的思维和复杂的渲染流程让用户用起来难以扩展。要死记住渲染流程。

了解之后可以用 OpenGL 来录制视频,代码是java的:
Android视频编辑器(一)通过OpenGL预览、录制视频以及断点续录等_qqchenjian318的博客

关于ffmpeg学习

Android使用FFmpeg(一)--编译ffmpeg - 简书

里面有完成ffmpeg学习过程,代码是java的,学习不要卡在ffmpeg编译,编译不过去可以跳过。直接看后面就可以。

一些有帮助的文章与教程

下面是我近年来学习的所有文章,有OpenGL,ffmpeg,mediacodec,gpuimage,OpenCV,WebRtc,还有很厉害的项目:CainCamera。里面也有不少已经失效的网址。。

OpenGL ES、OpenSL ES、OpenCV、WebRtc、SDL、SoundPool

常见问题:
图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别:

读完这篇文章,你就能全面掌握做视频码率设置:
https://www.bilibili.com/read/cv10439183/

Android 录屏时控制帧率:
https://www.jianshu.com/p/f2e4db2fb211

MediaCodec编码H264视频模糊、花屏:
https://www.jianshu.com/p/a0873b4a92b6

MediaCodec的bitrate_mode配置问题:

H264三种码率控制方法(CBR, VBR, CVBR):

H264编码中Baseline Main High简介:

H264系列十二 H.264概述:
https://www.jianshu.com/p/2ff4b2e865a3

浅谈TMPGEnc中码率控制的模式(CBR/VBR/CQ):
https://www.dianbo.org/forum.php?mod=viewthread&tid=1288

===========================================

Android视频编辑器(一)通过OpenGL预览、录制视频以及断点续录等

FFmpeg与OpenGL: https://cloud.tencent.com/developer/user/2061724https://github.com/ChenLittlePing/LearningVideo/tree/79e94cf5e35664e6dd2e1d595e2ec633f14acf22

OpenGL :https://zhuanlan.zhihu.com/p/150528739
OpenGL
FFmpeg 视频教程:
链接:https://pan.baidu.com/s/1juUEAMXBeVhQfvvMCUMz4g 
提取码:zjld 

NDK 视频教程:
链接:https://pan.baidu.com/s/1XYBKWx9wV-V9wR7P5jPKWA 
提取码:zjld 

OpenGL ES 视频教程:
链接:https://pan.baidu.com/s/1ax3NMoT0A8GohUgOw8uqhQ 
提取码:zjld

音视频相关资料和视频教程
链接: https://pan.baidu.com/s/1sQQo0Mq7gJcAYz8GTMLuPQ 
提取码: s2w3

视频录制编码解码:http://vivianking6855.github.io/2017/06/19/Android-Vedio-merge-Music/

Camera学习

Ffmpeg :官网:https://www.ffmpeg.org/

Ffmpeg 学习:https://www.jianshu.com/p/1bfece62c937

Ffmpeg github可使用的demo:https://github.com/coopsrc/FFPlayerDemo
        https://github.com/jdpxiaoming/PPlayer

ffmpeg采集nv21数据编码

直播实现
srs环境搭建:https://www.jianshu.com/p/60f2ee64137c
srs环境搭建参考

webrtc

OpenCV:https://www.w3cschool.cn/opencv/opencv-2gnx28u3.html

Android推拉流,直播功能

Android音视频编解码MediaCodec:https://www.jianshu.com/p/aac2f8699735

Android音频录制转码可视化等相关:https://www.jianshu.com/p/a72deab95b4c

rtmp推流介绍:https://www.jianshu.com/p/fedfeef4ed8f

手机内录和外录:https://www.tuicool.com/articles/RVJFF3v

ffmpeg命令(全)

Github音频文件转码:https://github.com/adrielcafe/AndroidAudioConverter

Android Ndk交叉编译ffmpeg,辉天神龙:
https://xucanhui.com/2018/07/22/android-ndk-ffmpeg-compile/ ffmpeg编译为一个so库:
https://www.jianshu.com/p/9ec753a7204e

Mp3 lame编译:
https://www.jianshu.com/p/d5c5dae3ac9c

Android利用lame录制mp3音频:
https://github.com/clam314/LameMp3ForAndroid

音视频学习汇总

//github音视频学习
https://github.com/979451341/Audio-and-video-learning-materials

OpenGL ES学习
https://www.wanandroid.com/article/list/0?cid=159

Android OpenGL添加水印并录制视频--抖音视频录制原理

OpenGL.ES在Android上的简单实践:21-水印录制(MediaCodec输出h264+MediaMuxer合成mp4 上):
https://github.com/ChenLittlePing/LearningVideo

FFmpeg库的使用。
https://github.com/NearXxx/FFmpegAndroid

音视频学习日志,OpenGL ,ffmpeg ,ndk:

Android图像滤镜框架GPUImage从配置到应用:

android 录制视频,使用OpenGL:
https://github.com/ICECHN/VideoRecorderWithOpenGL

CainCamera 介绍
CainCamera是一个集美颜相机、图片编辑、短视频编辑等功能的综合性开源APP,目前主要介绍美颜相机、短视频编辑功能的实现,图片编辑功能暂时还没时间处理。 本人编写该项目主要用于学习如何实现相机的实时美颜、动态滤镜、动态贴纸、彩妆、拍照、短视频分段录制与回删、图片编辑、短时频编辑与合成等功能:
https://github.com/CainKernel/CainCamera

- Camera

    [Android相机开发系列](https://www.polarxiong.com/archives/Android相机开发系列.html)

- graphics

    [Android图形架构](https://source.android.com/devices/graphics/architecture)

- OpenGLES

    [learnopengl-cn](https://learnopengl-cn.github.io/)

    [opengl-tutorial-cn](http://www.opengl-tutorial.org/cn/)

    [coordinate-mapping](https://developer.android.com/guide/topics/graphics/opengl#coordinate-mapping)

    [安卓 OpenGL ES 2.0 完全入门 一](https://blog.piasy.com/2016/06/07/Open-gl-es-android-2-part-1/)

    [安卓 OpenGL ES 2.0 完全入门 二](https://blog.piasy.com/2016/06/14/Open-gl-es-android-2-part-2/)

    [安卓 OpenGL ES 2.0 完全入门 三](https://blog.piasy.com/2017/10/06/Open-gl-es-android-2-part-3/)

    [OpenGL ES和坐标变换概述 一](http://zhangtielei.com/posts/blog-opengl-transformations-1.html)

    [OpenGL ES和坐标变换概述 二](http://zhangtielei.com/posts/blog-opengl-transformations-2.html)

    [http://www.songho.ca/opengl/index.html](http://www.songho.ca/opengl/index.html)

    [surfaceTexture#getTransformMatrix什么意思](https://stackoverflow.com/questions/30595493/what-does-the-return-value-of-surfacetexture-gettransformmatrix-mean-who-can-ex)

- PixelBufferObject

    [glReadPixels](https://www.khronos.org/opengl/wiki/GLAPI/glReadPixels)

    [Android 关于美颜/滤镜 利用PBO从OpenGL录制视频](https://www.jianshu.com/p/3bc4db687546)

    [gl_pbo](http://www.songho.ca/opengl/gl_pbo.html)

    [fast-pixel-transfers-with-pixel-buffer-objects](http://roxlu.com/2014/048/fast-pixel-transfers-with-pixel-buffer-objects)

    [像素缓冲对象](https://www.khronos.org/opengl/wiki/Pixel_Buffer_Object)

    [像素传输](https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_transfer_parameters)

- 音频采集

    [快速处理实时麦克风音频,设置回调功能](https://stackoverflow.com/questions/4525206/android-audiorecord-class-process-live-mic-audio-quickly-set-up-callback-func/4834651#4834651)

    [https://github.com/Kickflip/kickflip-android-sdk/issues/9](https://github.com/Kickflip/kickflip-android-sdk/issues/9)

    [android-dev-audiorecord-without-blocking-or-threads](https://stackoverflow.com/questions/15804903/android-dev-audiorecord-without-blocking-or-threads)

    [https://issuetracker.google.com/issues/36968761](https://issuetracker.google.com/issues/36968761)

- 编码

    [Android MediaCodec stuff](https://bigflake.com/mediacodec/)

    [MediaCodec](https://developer.android.com/reference/android/media/MediaCodec)

    [MediaMuxer](https://developer.android.com/reference/android/media/MediaMuxer)

    [optimizing-mediamuxers-writing-speed](https://blog.horizon.camera/post/134263616000/optimizing-mediamuxers-writing-speed)

    [安卓视频硬编码实现分析三](https://blog.piasy.com/2017/08/08/WebRTC-Android-HW-Encode-Video/)

    [我需要知道:H.264](https://blog.piasy.com/2017/09/22/I-Need-Know-About-H264/)

- 加水印

   [how-to-embed-text-while-recording-video-in-android](https://stackoverflow.com/questions/23735464/how-to-embed-text-while-recording-video-in-android)

   [media-for-mobile/blob/master/effects/src/main/java/org/m4m/effects/TextOverlayEffect.java](https://github.com/INDExOS/media-for-mobile/blob/master/effects/src/main/java/org/m4m/effects/TextOverlayEffect.java)

   [纹理翻转](https://stackoverflow.com/questions/7811195/must-opengl-textures-be-flipped?rq=1)

- 拍照相关

    [简化的Windows BMP位图文件格式规范](http://www.dragonwins.com/domains/getteched/bmp/bmpfileformat.htm)

    [保存一帧数据](https://stackoverflow.com/questions/21634450/how-can-we-make-the-saveframe-method-in-extractmpegframestest-more-efficient)

    [takePirture图片翻转的问题](https://stackoverflow.com/questions/28350695/flipping-opengl-texture-from-bytebuffer-before-creating-the-bitmap-in-android)

- 相关项目

   [grafika](https://github.com/google/grafika)

   [FilterRecord](https://github.com/a483210/myExample) 成功的使用出了PBO异步 glReadPixel , 读取耗时非常小

   [android-gpuimage-plus](https://github.com/wysaid/android-gpuimage-plus)

   [AudioVideoRecordingSample](https://github.com/saki4510t/AudioVideoRecordingSample)

   [media-for-mobile](https://github.com/INDExOS/media-for-mobile)

- 图像处理

   [Kernel (image_processing)](https://en.wikipedia.org/wiki/Kernel_(image_processing))

## Android Camera OpenGL添加水印并录制视频
>- 简单的视频录制,我们可以使用[MediaRecorder](https://developer.android.com/reference/android/media/MediaRecorder),具体示例可以参考[Gitee: Camera2VideoJava](https://gitee.com/chenjim/CameraDemo/tree/master/Camera2VideoJava)
>- 本文将介绍采集Camera的预览数据,然后通过OpenGL添加水印、贴纸、美颜滤镜等后渲染到GLSurfaceView,再用MediaCodec硬编码后通过[MediaMuxer](https://developer.android.com/reference/android/media/MediaMuxer)写入MP4文件。
> 源码地址: [Gitee: OpenGLRecorder](https://gitee.com/chenjim/CameraDemo/tree/master/OpenGLRecorder)

大致流程如下,详细可以参见相应代码连接
1. [CameraGlView](https://gitee.com/chenjim/CameraDemo/blob/master/OpenGLRecorder/app/src/main/java/com/chenjim/glrecorder/CameraGlView.java) 用来显示Camera预览的View
CameraGlView extends GLSurfaceView
2. 创建SurfaceTexture,用来显示Camera预览,参见[CameraRenderer.java](https://gitee.com/chenjim/CameraDemo/blob/master/OpenGLRecorder/app/src/main/java/com/chenjim/glrecorder/CameraRenderer.java)
mSurfaceTexture = new SurfaceTexture(mTextures[0]);
...
mCameraHelper.startPreview(mSurfaceTexture);

3. [CameraFilter.java](https://gitee.com/chenjim/CameraDemo/blob/master/OpenGLRecorder/app/src/main/java/com/chenjim/glrecorder/filter/CameraFilter.java),通过OpenGL将Camera数据写入FBO(Frame Buffer Object 帧缓存)
4. [TimeFilter.java](https://gitee.com/chenjim/CameraDemo/blob/master/OpenGLRecorder/app/src/main/java/com/chenjim/glrecorder/filter/TimeFilter.java),通过OpenGL在FBO上添加时间水印。
可以参考此处添加贴纸、美颜等
5. [ScreenFilter.java](https://gitee.com/chenjim/CameraDemo/blob/master/OpenGLRecorder/app/src/main/java/com/chenjim/glrecorder/filter/ScreenFilter.java),将FBO绘制到mSurfaceTexture
6. [MediaRecorder.java](https://gitee.com/chenjim/CameraDemo/blob/master/OpenGLRecorder/app/src/main/java/com/chenjim/glrecorder/MediaRecorder.java),用MediaCodec和EGL对Surface的内容采集编码为avc并写入到MP4文件

参考文章:
- [OpenGL ES SDK for Android: High Quality Text Rendering](https://arm-software.github.io/opengl-es-sdk-for-android/high_quality_text.html)
- [Github:opengl-es-sdk-for-android/HighQualityTextJava](https://github.com/ARM-software/opengl-es-sdk-for-android/tree/master/samples/advanced_samples/HighQualityTextJava)
- [Github:android-openGL-canvas](https://github.com/ChillingVan/android-openGL-canvas)
- Github:Media for Mobile is a set of easy to use components and API for a wide range of media scenarios such as video editing and capturing
- VideoRecorder高性能任意尺寸视频录制 断点录制 离屏录制 录制时的Canvas API支持 实时滤镜,[相关资料介绍Link](https://github.com/lll-01/VideoRecorder/blob/master/app/doc/相关资料.md)
- [抖音录制视频预习资料](https://www.jianshu.com/p/6aaa44072272)