那些年,Android音视频开发那些事儿

那些年,Android音视频开发那些事儿_第1张图片
音视频开发的主要应用有哪些?

音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱,等等

1.视频监控类 (JNI+应用层开发)
从硬件到嵌入式再到软件,涉及开发全面,从硬件数据采集,到中间服务器转发、再到上层终端软件渲染播放。涉及开发太多,Android端涉及到NDK、JNI层的开发
2.播放器类 (应用层开发)
播放器开发 分类,原生播放器播放、第三方播放器、监控类的底层播放器开发
3.直播类 (应用层开发)
目前市场上比较火的直播类,第三方平台众多 如七牛云、阿里云、腾讯直播云等等。
4.视频剪辑类 应用层开发
如用阿里云SDK 进行视频特效处理。

小结:音视频开发,就是要掌握图像、音频、视频的基础知识,并且学会如何对它们进行采集、渲染、处理、传输等一系列的开发和应用。

  • 采集:它解决的是,数据从哪里来的问题
  • 渲染:它解决的是,数据怎么展现的问题
  • 处理:它解决的是,数据怎么加工的问题
  • 传输:它解决的是,数据怎么共享的问题

每一个门类,都可以深挖,衍生出一个又一个充满技术挑战的话题,比如:如何更高效地渲染画面、如何提高音视频的压缩比,如何优化弱网下的音视频数据传输等等。

其实,音视频开发的技术积累,也没有那么难,带着问题去 Google,带着任务去实践,一切都不是问题,我们就从上面说的 4 个方向,逐个探索一下,有哪些知识点,是要我们去了解和掌握的。

下面分别从流程上做一个学习知识小结:

1. 采集

无论在哪个平台,图像、视频最初都是来自摄像头,而音频最初都是来自麦克风,因此,做音视频采集,就要掌握如下的技术知识:

  1. 系统的摄像头采集接口是什么,怎么用 ? 比如:Windows:DirectShow,Linux:V4L2,Android:Camera,iOS:AVCaptureSession 等
  2. 系统的摄像头采集的参数怎么配置,都是什么含义 ? 比如:分辨率、帧率、预览方向、对焦、闪光灯 等
  3. 系统的摄像头输出的图像/视频数据,是什么格式,不同格式有什么区别 ? 比如:图片:JPEG,视频数据:NV21,NV12,I420 等
  4. 系统的麦克风采集接口是什么,怎么用 ? 比如:Windows:DirectShow,Linux:ALSA & OSS,Android:AudioRecord,iOS:Audio Unit 等
  5. 系统的麦克风采集参数怎么配置,都是什么含义 ? 比如:采样率,通道号,位宽 等
  6. 系统的麦克风输出的音频数据,是什么格式? 比如:PCM

2. 渲染

无论在哪个平台,图像、视频最终都是要绘制到视图(View)上面,而音频最终都是要输出到扬声器,因此,做音视频渲染,就要掌握如下的技术知识:

1.系统提供了哪些 API 可以绘制一张图片或者一帧 YUV 图像数据的 ? 比如: Windows:DirectDraw,
Direct3D, GDI,OpenGL 等 Linux: GDI, OpenGL 等
Android:ImageView,SurfaceView,TextureView,OpenGL 等 iOS:
CoreGraphics,OpenGL 等
2. 系统提供了哪些 API 可以播放一个 mp3 或者 pcm 数据 ? 比如: Windows:DirectSound 等 Linux:ALSA & OSS 等 Android:AudioTrack 等 iOS: AudioQueue 等

3.处理

图像和音视频的加工,除了系统的 API,大多数都会依赖一些跨平台的第三方库的,通过掌握这些第三方库的原理和使用方法,基本上就可以满足日常音视频处理工作了,这些库包括但不限于:

图像处理:OpenGL,OpenCV,libyuv,ffmpeg 等
视频编解码:x264,OpenH264,ffmpeg 等
音频处理:speexdsp,ffmpeg 等

4.传输

传输,它解决的是,数据怎么共享的问题,那么,数据究竟怎么共享呢 ?

共享,最重要的一点,就是协议。

我觉得互联网之所以能够如此蓬勃地发展,将整个世界都紧密联系在一起,其实是离不开 W3C 这个委员会的巨大贡献的,因为无论什么数据,要想在不同的国家、不同设备之间互联互通,离不开 “标准”,有了 “标准”,大家就能互相读懂对方。

因此,研究音视频传输,其实就是在研究协议,具体有哪些协议呢 ?

音视频在传输前,怎么打包的,如:FLV,ts,mpeg4 等
直播推流,有哪些常见的协议,如:RTMP,RTSP 等
基于 UDP 的协议有哪些?如:RTP/RTCP,QUIC 等

互联网环境下的音视频的传输,是一个非常有挑战和价值的方向,为了解决弱网下的传输延时、卡顿,提高用户体验,整个业界都在不断地进行着深入的探索和优化。

回归音视频开发知识:
《Android 音视频从入门到提高 —— 任务列表》

  1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View

  2. 在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

  3. 在 Android 平台使用 Camera API 进行视频的采集,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调

  4. 学习 Android 平台的 MediaExtractor 和 MediaMuxer API,知道如何解析和封装 mp4 文件

  5. 学习 Android 平台 OpenGL ES API,了解 OpenGL 开发的基本流程,使用 OpenGL 绘制一个三角形

  6. 学习 Android 平台 OpenGL ES API,学习纹理绘制,能够使用 OpenGL 显示一张图片

  7. 学习 MediaCodec API,完成音频 AAC 硬编、硬解

  8. 学习 MediaCodec API,完成视频 H.264 的硬编、硬解

  9. 串联整个音视频录制流程,完成音视频的采集、编码、封包成 mp4 输出

  10. 串联整个音视频播放流程,完成 mp4 的解析、音视频的解码、播放和渲染

  11. 进一步学习 OpenGL,了解如何实现视频的剪裁、旋转、水印、滤镜,并学习 OpenGL 高级特性,如:VBO,VAO,FBO 等等

  12. 学习 Android 图形图像架构,能够使用 GLSurfaceviw 绘制 Camera 预览画面

  13. 深入研究音视频相关的网络协议,如 rtmp,hls,以及封包格式,如:flv,mp4

  14. 深入学习一些音视频领域的开源项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等

  15. 将 ffmpeg 库移植到 Android 平台,结合上面积累的经验,编写一款简易的音视频播放器

  16. 将 x264 库移植到 Android 平台,结合上面积累的经验,完成视频数据 H264 软编功能

  17. 将 librtmp 库移植到 Android 平台,结合上面积累的经验,完成 Android RTMP 推流功能

  18. 上面积累的经验,做一款短视频 APP,完成如:断点拍摄、添加水印、本地转码、视频剪辑、视频拼接、MV 特效等功能

总结:本文主要总结了音视频开发涉及的领域,以及开发流程中需要的方方面面的知识,学海无涯,在音视频的道路上需要不断探索,多一分有多一分的惊喜~

参考资料:

  1. 《雷霄骅的专栏》:http://blog.csdn.net/leixiaohua1020

  2. 《Android音频开发》:http://ticktick.blog.51cto.com/823160/d-15

  3. 《FFMPEG Tips》:http://ticktick.blog.51cto.com/823160/d-17

  4. 《Learn OpenGL 中文》:https://learnopengl-cn.readthedocs.io/zh/latest

  5. 《Android Graphic 架构》:https://source.android.com/devices/graphics/

  6. Android音视频开发专栏 http://blog.51cto.com/ticktick/1956269

  7. 从开发小白到音视频专家http://blog.51cto.com/ticktick/2046899?source=dra

你可能感兴趣的:(音视频,Android,手机端)