毕业至今,之前一直从事Android开发的工作,今年5月份开始接触音视频开发相关工作,于是打算写一个音视频相关专栏,让移动端的同学,能通过这个专栏快速掌握音视频相关知识,首先带来第一篇,主要讲讲移动端的音视频技术涉及哪些?

音视频开发基础知识(1)——图像基本概念
给Android工程师的音视频教程之一文弄懂MediaCodec

1. 整体流程

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

2. 数据采集

2.1. 音频采集

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

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

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

2.2 视频采集

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

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

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

3. 数据处理

3.1 音频处理

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

3.2 视频处理

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

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

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

4. 数据编码

4.1 音频编码

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

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

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

4.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) 方法来访问到原始视频数据帧。

5. 音视频混合


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

6. 数据传输

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

7. 需要用到的技术

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

Camera、Camera2、CameraX。
SurfaceView、TextureView、SurfaceTexture、GLSurfaceView。
OpenGL ES。
OpenCV、DLIB。
YUV、PCM、H.264、H.265、ACC。
AudioRecord、AudioTrack。
MediaRecorder。
MediaCodec。
MediaExtractor、MediaMuxer。
ffmpeg、ijkplayer。
RTMP、RTSP。

关注我的公众号,学习更多关于Android高级进阶,音视频开发知识

给Android工程师的音视频开发学习指南相关推荐

  1. Android Studio在音视频开发进阶指南中的Mp3Encoder中遇到的问题

    增加C++中java曾调用Native代码中遇到的问题 主要的错误: 在对应的class文件的目录下,执行下面的命令生成JNI接口文件 javah -jni com.phuket.tour.studi ...

  2. Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析

    Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析 本文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表 ...

  3. 23最新《Android音视频开发进阶指南》,音视频开发者速领

    作为Android开发程序员,我们时刻站在互联网的前端,而音视频作为现在乃至未来几年一个强劲的风口,吸引了许多程序员的关注. 那么音视频开发的行业现状究竟如何呢?我们又该怎样入门呢?请看下文: 音视频 ...

  4. 2022全网最详细的音视频开发学习路线,零基础到项目实战,从小白到音视频专家

    前言 音视频的历史与前景在这里就不介绍了,小编之前的文章里面都有讲到. 行业现状分析 核心竞争力:定义音视频是程序届的皇冠,掌握音视频意味着拿到通往未来的船票,不用担心会被其他人替代.音视频是有门槛的 ...

  5. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)

    随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译者: ...

  6. Android IOS WebRTC 音视频开发

    转 自:http://www.cnblogs.com/lingyunhu/category/626157.html 作者:lingyunhu rtc.blacker@gmail.com 随笔分类 - ...

  7. Android IOS WebRTC 音视频开发总结(三八)-- tx help

    Android IOS WebRTC 音视频开发总结(三八)-- tx help 本文主要介绍帮一个程序员解决webrtc疑问的过程,文章来自博客园RTC.Blacker,支持原创,转载请说明出处(w ...

  8. Android IOS WebRTC 音视频开发总结(二三)-- hurtc使用说明

    Android IOS WebRTC 音视频开发总结(二三)-- hurtc使用说明 本文主要介绍如何测试基于浏览器和手机的视频通话程序,转载请说明出处,文章来自博客园RTC.Blacker,更多详见 ...

  9. Android IOS WebRTC 音视频开发总结(四二)-- webrtc开发者大会

    Android IOS WebRTC 音视频开发总结(四二)-- webrtc开发者大会 本文主要介绍11月要在北京举办的webrtc开发者全球大会,文章来自博客园RTC.Blacker,支持原创,转 ...

最新文章

  1. python二维列表排序
  2. 学会使用Chromium中的LOG
  3. 卷积神经网络原理及实现
  4. BUUCTF-Reverse:SimpleRev(算法分析题)
  5. .cpp 编译成.a或是 .so
  6. centos7安装nginx和php,centos7安装nginx1.10和php7
  7. java junit4_JUnit4使用Java5中的单元测试
  8. 光模块兼容性介绍,如何测试兼容光模块的兼容性?
  9. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
  10. Apollo进阶课程㊲丨Apollo自动驾驶架构介绍
  11. 做数学与拼乐高的若干相似之处
  12. Linux系统编程——孤儿进程模拟及分析
  13. 腾讯又“撒钱”了!奖励2.28万员工800万股,人均16.6万港元 网友:福利界天花板...
  14. 2018 腾讯功能游戏开发者赛事火热开启
  15. ug998逻辑思维导图
  16. yolo系列算法思想流程简单讲解概述————(究极简单的讲述和理解)
  17. 从《我不是潘金莲》谈程序员的核心竞争力 1
  18. Ludwig Otto Hölder
  19. 10分钟了解BIM+GIS融合,常见BIM数据格式及特性
  20. Python中字符串常见操作总结

热门文章

  1. Flutter2 来了!!!
  2. Android客户端与服务器端数据库同步
  3. 新奥集团CEO张叶生:中国将是全球最大的天然气增量市场
  4. 课程设计:模拟全球通计费程序--java(包含源码、思路、结果)
  5. FZU Problem 2221 RunningMan(贪心)
  6. 11月英语总结-你不是一个人在战斗
  7. WPS生成目录出现正文如何处理
  8. MySQL查询优化器工作原理解析
  9. 小米2恢复出厂设置(硬件格式化)
  10. 企业网站建设有哪些?PHP好用吗?