在星球经常被问到的问题,Android开发想转行音视频,应该要怎么做?

很多人对此都有疑惑,不光有工作多年的职场老司机,也有求学期间的研究生同学们,摘录了其中一部分提问,可以看到大家的疑惑是有类似的。

Android开发想转行音视频,应该要怎么做?_Android

Android开发想转行音视频,应该要怎么做?_音视频_02

Android开发想转行音视频,应该要怎么做?_音视频开发_03

Android开发想转行音视频,应该要怎么做?_Android_04

Android开发想转行音视频,应该要怎么做?_Android_05

对于星球用户的每个提问我都有认真回答,毕竟每个人的情况不一样,没有什么统一的答案。

这些提问其实可以归为两类:

  1. 针对自己的情况,现阶段要从事音视频开发吗?这是一个关于利弊分析的问题,也是特别实际,很现实的问题。
  2. 已经决定从事音视频开发,要怎么去做呢?这是一个学习路线的问题,也是我个人的经验可以给到帮助的问题。

其实,第一类问题要不要从事音视频开发 会比 第二类问题从事音视频开发要怎么做 更难回答一些,毕竟迈出第一步永远是最难的。

要不要从事音视频开发

尤其是针对已经工作多年的朋友来说,这是一个职业规划的问题,每个人的职业经历、思考角度甚至利益关系都不一样,在十字路口上选择的方向也是不同的。

不同于技术问题的回答,闻道有先后,术业有专攻,在我不熟悉的领域回答错了问题,并不是一件丢人的事情,反而是个学习的机会。

但职场上给错了建议,并且听从执行了,那在短暂的程序员生涯上可能会造成不可逆的影响,尤其是我本身还从事音视频的开发,在一些观念上就会有一些偏袒,很难做到客观中立。

所以针对第一类问题,我只能从行业趋势和自己的观察上给出一些看法。

这一两年因为该死的疫情,让短视频、超高清视频和实时音视频反而成为需求风口。

我的看法当然是觉得音视频这个行业还可以,而且从我自己的观察来看,做音视频的现在普遍年龄都在 30+ 了,我 94 年的在组里有可能还是年龄最小的那一批人了。

做客户端上的音视频、服务端上的、嵌入式的、系统底层的都是音视频的范围,另外从事音视频编解码算法、网络通信协议、视频超分、音频降噪等等,也是音视频的领域范围内,所以说音视频也可以是一个很大的范围体系,每个人处在其中的位置不同而已。

如果你很熟练 FFmpeg ,熟悉播放器,或者很懂 OpenGL 渲染,那么不懂 JVM ,不懂 Android Framework 一点也不妨碍你找高薪工作。

以上就是关于 第一类问题要不要从事音视频开发 的建议,每个人都不同,具体情况还是要具体分析的,仅供参考。

如果你决定迈出第一步,尝试一下入门或者转行音视频,那么可以接下往下看了。

从事音视频开发要怎么做

对于 第二类问题从事音视频开发要怎么做 大概会从四个方面给出路线:

  1. 概念
  2. 技能
  3. 架构
  4. 实践

概念

首先,最重要的就是概念了。

既然认为音视频也是一个单独的领域,那么每个领域就会有它对应的名词概念。学音视频也和我们上学学习一样,一门学科一开始肯定要学一些新的名词概念。

关于音视频常见的概念有哪些呢?帧率、码率、I 帧、B 帧、P 帧吗?

那么问题来了,这些概念你是从哪里得知的?尤其是 I 帧、B 帧、P 帧这种常见的面试八股文会提到的

想必很多人我和一样,都是从网络上一些博客中得知的。但网络博客质量参差不齐,且不说一篇文章会被反复抄袭无数遍,就文章中内容可能都不是对的,而有的同学却没有经过的自己思考,盲目的吸收这些概念,等到后期遇到疑难杂症要解决时,却发现连一些基础概念都没搞懂。

这也是目前学习音视频中比较蛋疼的地方,缺少统一的教材能够把一些概念讲清楚,尤其是涉及深一点的概念,牵扯的内容很多,不是一两页就能讲清楚的。

后续如果遇到好的资料,也会在知识星球内分享给大家。

这里我举个例子,前端面试中会有个典型的题目:从输入 URL 到页面展示到底发生了什么?

换到音视频行业中,从相机录制到编码成视频会发生什么,牵扯到哪些概念?

就这么一个问题都会涉及到很多操作和概念了,而从移动端转向音视频开发的同学可能就缺少系统的了解,只有碎片化的学习。

就相机操作来说,常见的相机光圈、ISO 参数、测光模式、对焦模式、焦距、曝光补偿等概念。

就相机数据来说,YUV 格式,NV12、YUV420 等,另外还涉及到色域空间 BT.601、BT.709 等,再深入还能涉及相机的 Gamma 曲线,还有 HDR 视频的 HLG、PQ 曲线,Tone Mapping 概念等。

就视频编码来说,涉及到 H.264 算法,常见概念有 IDR 帧、I 帧、B 帧、P 帧等,另外还有开放 GOP 和闭合 GOP 、静态码率和动态码率、AVCC 和 Annex-b 码流格式等。

就音频编码来说,涉及到 ACC 算法,常见概念有采样率、采样位数、声道数、比特率等,深入一点的话,还有 ACC 的 ADTS 以及 ADIF 文件格式信息等。

最后封装成的 MP4 视频,涉及到封装格式,MP4 的各种 BOX 概念,常见的有 ftyp、moov、ctts 等,另外如何用工具去排查格式问题。

以上概念算是很常见了,面试八股文中会问到,死记硬背当然简单,但要实际去理解这些概念,在代码中调试他们,真真切切地感受这些概念的差异。

另外,这些涉及到图像、视频、音频等基础概念,不要觉得是 IT 人员搞音视频才会有的,还没有音视频技术之前人类就已经研究过很多年了。

就好比色域空间这个概念,在艺术领域同样要用到,设计师们也要了解 sRGB 色域、P3 色域等知识。再比如采样率这个概念,著名的奈奎斯特采样定理早在上个世纪20年代就提出了,而第一台计算机二十年后才诞生。理论先行,思想指导行动这个道理肯定没错的。

音视频也可以认为是一门杂学科目,确实各个方面都会涉及到,这也是为什么要强调概念很重要,基础不牢,地动山摇。

当然了,一开始也不可能掌握好所有的概念,但随着深入的学习就会愈发觉得把一些基础概念弄清楚有多重要。

2. 技能

掌握音视频概念之后,接下来就是技能了,也是很多人关心的音视频开发要如何学习的部分。

为什么要把这部分称作技能呢?在网上其实也有很多音视频入门指南了,有的指南还很全面,每篇文章都会讲解技术点,讲述 API 具体如何使用等。

举个例子:

  1. 使用 MediaExtractor 和 MediaMuxer 来解封装和封装 mp4 文件
  2. 使用 MediaCodec 来编码和解码 H.264 和 AAC 数据
  3. 使用 Camera API 完成相机的预览、对焦操作
  4. 使用 FFmpeg 做视频的解封装和封装
  5. 使用 FFmpeg、libx264、libfdk-aac 等各种库完成音视频的编解码操作等

以前的我也认为把上面内容都掌握了,就算是学懂音视频了,现在才觉得他们就是一些技能而已,是学习音视频的必要不充分条件。

音视频相关的技能操作肯定是必须要掌握的,但如果只沉醉于各种技能的学习,那么我可以很认真地告诉你,你只会是一个工具人而已

不要为了学习技能而学习技能,举个例子,安卓上想要实现音频的播放有哪些方式呢?

系统提供的 API 就有 MediaPlayer 、AudioTrack 直接播放音频,底层一点还可以用 OpenSL 播放音频。

另外还可以使用第三方库 FFmpeg、libfdk-aac 等来做解码操作配合上层接口播放音频。

想要实现同样的功能,可以有多种不同的方案设计。那么多排列组合都去掌握的话,当然学不过来了。

不是说掌握技能不重要,而是说要换一种思路去学习。

技术方案排列组合有很多,但最终的业务形态是有限的呀,比如播放器、直播推拉流、音视频通话、短视频录制和编辑等,而且这些业务形态有一些技能还是通用的。

在学习音视频时,就要先设定某种业务形态,围绕这个业务去掌握一系列技能,并选择最优的解决方式。

比如想做播放器,那么先掌握用 MediaExtractor 去解封装、用 MediaCodec 解码、用 OpenGL 渲染等,然后再用 FFmpeg 去解封装和解码,这个时候完成了第一版基础技能掌握,然后再用不同的实现方案替换中间的某个环节,对比新旧方案的效率怎么样,哪个更优?

更好的方案当然要优先使用,为什么大厂的音视频体验那么好,因为他们早在各种方案中选择了最优的。

通过这样的方式学习技能,才不会因为一些新的技术出现来疲于奔命。

3. 架构

假如此时,你已经熟练使用各种音视频技能,并且对每个方案的实现优劣都很清楚,能选择最好的方案,那么恭喜你已经是一个优秀的工具人了。

为什么还要强调工具人呢,因为工具人只会实现功能,缺少了一些架构思想,而这正是进阶转变的关键之处。

同事之间经常说自己是做音视频工程的,一些特效、算法都是其他组做的,我们做的工程要很灵活的去对接和业务拓展,像剪映的编辑模块有很多功能,画中画、曲线变速、蒙版、定格、动画等,既有涉及编解码的,也有涉及效果,如果架构设计一开始没弄好的话,后面业务迅速发展,技术侧就很难保证迭代速度可以跟上业务脚步了。

这个时候光掌握一些技能就不够看了,要学会打地基,学会设计架构,从一个小的模块开始再到整体的模块。

当然架构设计也不是空中阁楼,不可能脱离业务存在的,想要做好架构设计,首先还是要理解好自己的业务,针对目前在业务上的弊端做优化,同时也多观察竞品的功能,假如现在的设计要实现竞品的功能,又会遇到哪些问题呢?另外,针对问题要能看到问题的本质,抽象出自己的理解。

除此之外,多看一些优秀的开源项目也是大有裨益的,就比如 FFmpeg 的源码和结构设计,还有 GStreamer 和 WebRTC 的源码及架构设计,这些优秀的开源库都是经受过项目考验的,仿照着学习就已经能够提高很多了。

另外,关于架构设计,目前业内经常会有交流活动,一些大厂也会在活动会议上把自己的架构方案与遇到的问题拿出来和大家分享,虽说具体的技术实现细节很少有人讲,但大的方案和趋势还是可以借鉴参考的。

后续有一些好的架构设计,也会在 音视频开发进阶 知识星球内分享给大家!

4. 实践

放在最后,也是最重要的模块,就是实践了,实践出真知。

入门或者转行音视频,理论方案说再多,还是要落实到行动上,强调实践,整起来就流弊!!!

另外,实践也要讲究环境氛围,他人的实践也可以成为你成长的台阶,就比如音视频的细节很多,我也不可能什么都搞过,但是我的同事搞过,我可以去了解他做内容,同样增加了自己的知识面,反过来亦如此。

如果你觉得自己掌握的已经够好,那么不妨跳出来试试外面的世界,也许会有更好的机会在等你。

最后给大家分享一份《音视频精编源码解析》,内容分为7个章节,涵盖 WebRTC Native 源码导读、X264 源码解读、FFmpeg、ijkplayer 源码分析系列、jsmpeg 源码解析、Live555 源码解析、Opus 源码解析,一共 675 页。

第一章 WebRTC Native 源码导读

  • 第一节-安卓相机采集实现分析
  • 第二节-安卓预览实现分析
  • 第三节-安卓视频硬编码实现分析
  • 第四节-VideoCRE 与内存抖动优化
  • 第五节-安卓 P2P 连接过程和 DataChannel 使用
  • 第六节-视频数据 native 层之旅
  • 第七节-混音
  • 第八节-P2P 连接过程完全解析
  • 第九节-API 概览
  • 第十节-RTP H.264 封包与解包


第二章 X264源码解读

  • 第一节-概述
  • 第二节-x264命令行工具
  • 第三节-编码器主干部分-2
  • 第四节-x264_slice_write()
  • 第五节-滤波(Filter)部分
  • 第六节-宏块分析(Analysis)部分-帧内宏块(Intra)


第三章 FFmpeg

  • 第一节-FFmpeg 编译和集成
  • 第二节-FFmpeg + ANativeWindow 实现视频解码播放
  • 第三节-FFmpeg + OpenSLES 实现音频解码播放
  • 第四节-FFmpeg + OpenGLES 实现音频可视化播放
  • 第五节-FFmpeg + OpenGLES 实现视频解码播放和视频滤镜
  • 第六节-FFmpeg 播放器实现音视频同步的三种方式
  • 第七节-FFmpeg + OpenGLES 实现 3D 全景播放器
  • 第八节-FFmpeg 播放器视频渲染优化
  • 第九节-FFmpeg、x264以及fdk-aac 编译整合
  • 第十节-FFmpeg 视频录制 - 视频添加滤镜和编码
  • 第十一节-FFmpeg + Android AudioRecorder 音频录制编码
  • 第十二节-Android FFmpeg 实现带滤镜的微信小视频录制功能


第四章 ijkplayer 源码分析系列

  • 第一节-整体结构总结
  • 第二节-read_thread流程
  • 第三节-解码流程
  • 第四节-渲染流程


第五章 jsmpeg 源码解析

  • 第一节-基础知识 字符处理 ArrayBuffer TypedArray
  • 第二节-TS码流 PAT PMT
  • 第三节-源码buffer.js对Uint8Array的封装
  • 第四节-源码ts.js TS格式解析流程
  • 第五节-源码mpeg1.js MPEG1码流结构
  • 第六节-概要总结


第六章 Live555源码解析

  • 第一节-GROUPSOCK
  • 第二节-MEDIUM媒体基础类
  • 第三节-MEDIASOURCE、MEDIASINK、MEDIASESSION、MEDIASUBSESSION
  • 第四节-FRAMEDSOURCE、RTPSOURCE、RTPSINK
  • 第五节-GENERICMEDIASERVER、RTSPSERVER、RTSPCLIENT
  • 第六节-testRTSPClient
  • 第七节-ServerMediaSession、ServerMediaSubsession、live555MediaServer


第七章 Opus源码解析

  • 第一节-简介
  • 第二节-编解码器使用
  • 第三节-手撸一个Opus编码程序
  • 第四节-Opus解码程序实现
  • 第五节-OggOpus封装器全解析
  • 第六节-Opus编码基础之认识声音
  • 第七节-Opus编码基础之压缩编码

Android开发想转行音视频,应该要怎么做?_Android_06