前言

现在市面上的图像,音视频软件越来越多,最近两年也是直播,短视频的红利期。而图像、音视频一直是互联网视觉的入口,掌握并熟练运用音视频、图像技术已经是当前互联网时代不可或缺的技能,而且这个技能是具有沉淀性质的。

目前市面上的学习资料参差不齐,我觉得想要开启音视频的学习之路,先得了解整体流程上会涉及的技术点,再一个个击破。我也是音视频方面的小白,最近公司要做一个视频换脸的应用,目前处于技术调研期。趁此空档,我准备开始我的音视频学习之路。

音视频 app

图像类:

音频类:

视频类:

整体流程

以手机直播为例,其整体流程如下:

数据采集

  • 1. 音频采集

音频采集涉及到以下几点:

  • 检测麦克风是否可以使用;
  • 需要检测手机对某个音频采样率的支持;
  • 在一些情况下需要对音频进行回声消除处理;
  • 音频采集时设置正确的缓冲区大小。

在 Android 系统中,一般使用 AudioRecord 或者 MediaRecord 来采集音频。AudioRecord 是一个比较偏底层的 API,它可以获取到一帧帧 PCM 数据,之后可以对这些数据进行处理。而 MediaRecorder 是基于 AudioRecorder 的 API (最终还是会创建AudioRecord 用来与 AudioFlinger 进行交互) ,它可以直接将采集到的音频数据转化为执行的编码格式,并保存。

  • 2. 视频采集

视频采集涉及到以下几点:

  • 检测摄像头是否可以使用;
  • 摄像头采集到的图像是横向的,需要对采集到的图像进行一定的旋转后再进行显示;
  • 摄像头采集时有一系列的图像大小可以选择,当采集的图像大小和手机屏幕大小比例不一致时,需要进行特殊处理;
  • Android 手机摄像头有一系列的状态,需要在正确的状态下才能对摄像头进行相应的操作。
  • Android 手机摄像头的很多参数存在兼容性问题,需要较好地处理这些兼容性的问题。

在 Android 系统下有两套 API 可以进行视频采集,它们是 Camera 和 Camera2 。Camera是以前老的 API ,从 Android 5.0(21) 之后就已经放弃了。和音频一样,也有高层和低层的 API,高层就是 Camera 和 MediaRecorder,可以快速实现编码,低层就是直接使用 Camera,然后将采集的数据进行滤镜、降噪等前处理,处理完成后由 MediaCodec 进行硬件编码,最后采用 MediaMuxer 生成最终的视频文件。

数据处理

  • 1. 音频处理

可以对音频的原始流做处理,如降噪、回音、以及各种 filter 效果。

  • 2. 视频处理

现在抖音、美图秀秀等,在拍摄,视频处理方面,都提供了很多视频滤镜,而且还有各种贴纸、场景、人脸识别、特效、添加水印等。

其实对视频进行美颜和添加特效都是通过 OpenGL 进行处理的。Android 中有 GLSurfaceView,这个类似于 SurfaceView,不过可以利用 Renderer 对其进行渲染。通过 OpenGL 可以生成纹理,通过纹理的 Id 可以生成 SurfaceTexture,而 SurfaceTexture 可以交给 Camera,最后通过纹理就将摄像头预览画面和 OpenGL 建立了联系,从而可以通过 OpenGL 进行一系列的操作。

美颜的整个过程无非是根据 Camera 预览的纹理通过 OpenGL 中 FBO 技术生成一个新的纹理,然后在 Renderer 中的onDrawFrame() 使用新的纹理进行绘制。添加水印也就是先将一张图片转换为纹理,然后利用 OpenGL 进行绘制。添加动态挂件特效则比较复杂,先要根据当前的预览图片进行算法分析识别人脸部相应部位,然后在各个相应部位上绘制相应的图像,整个过程的实现有一定的难度,人脸识别技术目前有 OpenCV、Dlib、MTCNN 等。

数据编码

  • 1. 音频编码

Android 中利用 AudioRecord 可以录制声音,录制出来的声音是 PCM 声音,使用三个参数来表示声音,它们是:声道数、采样位数和采样频率。如果音频全部用 PCM 的格式进行传输,则占用带宽比较大,因此在传输之前需要对音频进行编码。

现在已经有一些广泛使用的声音格式,如:WAV、MIDI、MP3、WMA、AAC、Ogg 等等。相比于 PCM 格式而言,这些格式对声音数据进行了压缩处理,可以降低传输带宽。对音频进行编码也可以分为软编和硬编两种。软编则下载相应的编码库,写好相应的 JNI,然后传入数据进行编码。硬编则是使用 Android 自身提供的 MediaCodec。

硬编码和软编码的区别是:软编码可以在运行时确定、修改;而硬编码是不能够改变的。

  • 2. 视频编码

在 Android 平台上实现视频的编码有两种实现方式:一种是软编,一种是硬编。软编的话,往往是依托于 cpu,利用 cpu 的计算能力去进行编码。比如我们可以下载 x264 编码库,写好相关的 JNI 接口,然后传入相应的图像数据。经过 x264 库的处理以后就将原始的图像转换成为 h264 格式的视频。

硬编则是采用 Android 自身提供的 MediaCodec,使用 MediaCodec 需要传入相应的数据,这些数据可以是 YUV 的图像信息,也可以是一个 Surface,一般推荐使用 Surface,这样的话效率更高。Surface 直接使用本地视频数据缓存,而没有映射或复制它们到 ByteBuffers;因此,这种方式会更加高效。在使用 Surface 的时候,通常不能直接访问原始视频数据,但是可以使用ImageReader 类来访问不可靠的解码后 (或原始) 的视频帧。这可能仍然比使用 ByteBuffers 更加高效,因为一些本地缓存可以被映射到 direct ByteBuffers。当使用 ByteBuffer 模式,可以利用 Image 类和 getInput/OutputImage(int) 方法来访问到原始视频数据帧。

音视频混合

下面我盗了一张图,画图实在太费时间:

以合成 MP4 视频为例:

  • 1. 整体来看,合成的 MP4 文件,视频部分为 H.264 编码格式的数据,音频部分为 AAC 编码格式的数据。
  • 2. 通过 MediaMuxer 提供的接口-writeSampleData(),将 H.264 和 AAC 数据分别同时写入到 MP4 文件。

数据传输

目前比较主流的视频推流协议有 RTMP 协议、RTSP 协议

涉及的技术

涉及到如下技术,我将从图像、音频、视频的顺序来罗列:

  1. Camera、Camera2。
  2. SurfaceView、TextureView、SurfaceTexture、GLSurfaceView。
  3. OpenGL ES。
  4. OpenCV、DLIB。
  5. YUV、PCM、H.264、H.265、ACC。
  6. AudioRecord、AudioTrack。
  7. MediaRecorder。
  8. MediaCodec。
  9. MediaExtractor、MediaMuxer。
  10. ffmpeg、ijkplayer。
  11. RTMP、RTSP。

后面我将针对这些技术,来学习音视频相关的技术。

音视频篇 - Android 音视频涉及到的技术相关推荐

  1. android 视频美颜,Android短视频中如何实现720P磨皮美颜录制?

    视频中磨皮.美颜功能已成为刚需,那么如何在Android短视频中实现720P磨皮美颜录制?本篇文章中,网易云信资深开发工程师将向大家介绍具体的操作方法. 相关阅读推荐 在Android上要实现一个录制 ...

  2. android 短视频例子,Android短视频开发解析,什么才是开发的重点

    随着短视频的潮流席卷祖国大地,进行Android短视频开发的朋友们也越来越多了,相信很多朋友在进行短视频开发.平台搭建的时候会有点蒙,短视频这么多功能,哪个是重点呀? 接下来就为大家讲解一下,Andr ...

  3. android获取网络视频缩略图,Android 获取视频(本地和网络)缩略图的解决方案

    在Android 开发视频的时候,通常都需要显示视频列表,而视频列表通常都有一张视频缩略图,那么它是怎么获取的呢, 关于网络视频的缩略图的实现方案主要有两种: 1.后台返回视频时顺便连缩略图的路径都返 ...

  4. android 设置视频大小,android – 调整视频大小

    我正在尝试动态设置 Android VideoView的大小.我看过StackOverflow以及互联网;我找到的最佳解决方案是从 here开始.我已经将我的实现放在下面: public class ...

  5. android的视频直播,Android进行视频,直播播放

    写在前面 忙忙碌碌一个多月没怎么写过文章了,今天来写写Android中的视频,直播播放,斗猫项目里用到直播流,坑踩了不少,可算是填上了.以下代码已上传至:https://github.com/Xxxx ...

  6. android 查看视频大小,android mediaplayer 视频修改视频大小 (屏幕尺寸mediaPlayer =......

    1 主要是通过更改view 的大小来改变视频的大小. 2 在视频初始化时获得视频的高宽都为0 ,这个必须要注意,必须播放后延时 修改view 大小 3 sufaceview 的布局类是 android ...

  7. 音视频开发 ● Android 音视频开发总结

    关于视频中的黑屏.花屏.绿屏问题 我们在做音视频开发的时候难免会遇到一些很棘手的问题,但是我们只要找准问题出现的阶段,定位问题的根源就会轻松很多. 前几天我看了一篇总结这些问题的文章,写的很好,根据自 ...

  8. android 音视频流采集,Android 音视频开发(四):使用 Camera API 采集视频数据(示例代码)...

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  9. android gpu 视频编码,Android Mp4视频录制(OpenGL实现篇,附DEMO)

    上一篇中(http://www.jianshu.com/p/113e4eedb752),我们已经了解了视频录制的大概流程,以及部分关键代码,在这一篇,我给大家介绍借助OpenGL来对视频图像进行处理的 ...

  10. Android 代码实现视频加密,android实现视频的加密和解密(使用AES)

    java语言进行加密解密速度挺慢的..一个6mb左右的文件需要10多秒...等有空了瞅瞅ffmpeg去.. mainactivity.java /** * 视频加密/解密 * * @author ol ...

最新文章

  1. 打包android阴影不见,Android无pading超简单超实用阴影解决方案
  2. NO.104使用禅道创建和评审需求
  3. Unity网格合并_材质合并
  4. 金相图像处理 matlab,基于MATLAB软件的图像处理技术 毕业论文.doc
  5. 写一个使两个整数进行交换的方法(不能使用临时变量) 【前端每日一题-27】...
  6. 美开发思想头盔让士兵通过脑电波交流
  7. mysql镜像_Mysql phpmyadmin docker镜像安装
  8. linux-目录结构
  9. Win10 Edge浏览器续航碾压火狐/Chrome
  10. 恢复误删文件 Windows File Recovery
  11. 脚本都不写,不能算正式测试
  12. 检索 COM 类工厂中 CLSID 为 {xxx} 的组件失败,原因是出现以下错误: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。...
  13. 腾讯云、声网、快手抢跑视频云
  14. EasyExcel(一)导入excel的分析监听器
  15. laravel 路由_简单的Laravel路由
  16. 真实的感情---可是你没有
  17. 计算机专业我的工匠梦作文,【推荐】我的科技梦作文7篇
  18. HTML5之canvas画布教你绘画小黄人
  19. LeetCode 1104. Path In Zigzag Labelled Binary Tree解题报告
  20. 深耕核心技术·赋能数字化转型

热门文章

  1. jQuery——淘宝购物车结算页面demo
  2. 用python预测小孩的身高_预测孩子身高的实用方法
  3. python构造方法的方法名_构造方法是类的一个特殊方法,Python中它的名称为()。
  4. 腾讯入局“低代码”赛道:无需敲码,快速生成一个完整系统!
  5. redhat 6.5安装oracle时出现java异常_Redhat6.2安装Oracle11g客户端及遇到的问题分析
  6. c#字符串的格式化输出
  7. Groq:从头设计一个张量流式处理器架构
  8. msgbox php,VBA消息框(MsgBox)
  9. 2022年中式面点师(初级)考试题库及模拟考试
  10. 怎么学好html5和css3,如何提高你的CSS水平