Android音视频开发,我想很多开发者都知道这个概念,音视频开发不仅需要掌握图像、音频、视频的基础知识,并且还需要掌握如何对它们进行采集、渲染、处理、传输等一系列的开发和应用,因此,音视频开发是一门涉及到很多内容的领域,主要内容如下(一图胜千言)
音视频-1
采集:
采集,在音视频开发中主要针对的是数据从哪里来的问题。图像、视频的可视化数据来自摄像头这毫无疑问,而音频数据则是来自麦克风,关于采集的知识点涉及到如下内容:
-
系统的摄像头采集接口是什么,怎么用 ?
如:Windows:DirectShow,Linux:V4L2,Android:Camera -
系统的摄像头采集的参数怎么配置,都是什么含义 ?
如:分辨率、帧率、预览方向、对焦、闪光灯 等 -
系统的摄像头输出的图像/视频数据,是什么格式,不同格式有什么区别 ?
如:图片:JPEG,视频数据:NV21,NV12,I420 等 -
系统的麦克风采集接口是什么,怎么用 ?
如:Windows:DirectShow,Linux:ALSA & OSS,Android:AudioRecord,iOS:Audio Unit 等 -
系统的麦克风采集参数怎么配置,都是什么含义 ?
如:采样率,通道号,位宽 等 -
系统的麦克风输出的音频数据,是什么格式?
如:PCM
渲染:
渲染,在音视频开发中主要针对的是数据展现的问题。我们知道,图像、视频最终都是要绘制到视图(View层)上面,而音频最终都是要输出到扬声器,因此,做音视频渲染,就要掌握如下的技术知识:
- 系统提供了哪些 API 可以绘制一张图片或者一帧 YUV 图像数据的 ?
如:
Windows:DirectDraw, Direct3D, GDI,OpenGL 等
Linux: GDI, OpenGL 等
Android:ImageView,SurfaceView,TextureView,OpenGL 等
- 系统提供了哪些 API 可以播放一个 mp3 或者 pcm 数据 ?
如:
Windows:DirectSound 等
Linux:ALSA & OSS 等
Android:AudioTrack 等
处理:
渲染,在音视频开发中主要针对的是数据如何加工的问题,那具体怎么处理?如下图:
音视频-处理
针对图像和音视频的处理,实现方式除了使用系统的 API,大多数也会使用一些优秀的第三方库,通过掌握这些第三方库的原理和使用方法,基本上就可以满足日常音视频处理工作了,这些库包括但不限于:
- 图像处理:OpenGL,OpenCV,libyuv,ffmpeg 等
- 视频编解码:x264,OpenH264,ffmpeg 等
- 音频处理:speexdsp,ffmpeg 等
- 音频编解码:libfaac,opus,speex,ffmpeg 等
传输:
传输,在音视频开发中主要针对的是数据共享的问题,采集完并处理数据以后,我们如何快速传输数据这一难题又摆在了面前,试想如果一个以音视频为主导业务的APP如果在播放过程中非常卡顿的话,用户体验那会是非常糟糕的。因此,解决传输的问题也就摆在了我们的面前。那么,数据究竟如何实现传输共享呢 ?共享,实现细则最重要的一点,就是协议,因此需要具体掌握的协议如下:
- 打包,音视频在传输前怎么打包,如:FLV,ts,mpeg4 等
- 直播推流,有哪些常见的协议,如:RTMP,RTSP 等
- 直播拉流,有哪些常见的协议,如:RTMP,HLS,HDL,RTSP 等
- 基于 UDP 的协议有哪些?如:RTP/RTCP,QUIC 等
总体来说 Android音视频开发属于高级研发工程师涉及到的领域,市场上对于Android音视频开发工程师提供的薪资真的是very very可观的,另外,Android音视频开发的学习系列文章主要是参考Jhuster前辈的博客和指导意见,这里在次感谢前辈们的无私分享,前辈也给出了具体的学习任务线,具体内容如下:
- 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 特效等功能
加油吧少年!
如果这篇文章对您有开发or学习上的些许帮助,希望各位看官留下宝贵的star,谢谢。
Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果
网友评论