V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
glumess
V2EX  ›  Android

入门或者转行音视频,应该要怎么做?

  •  
  •   glumess · 187 天前 · 2502 次点击
    这是一个创建于 187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知,前段时间开了 音视频开发进阶 知识星球,已经有不少朋友加入并且活跃起来了。

    关于知识星球的介绍可以看这篇文章:

    一个关于音视频领域专业问答的小圈子!!

    目前 音视频开发进阶知识星球 还在让利中,非常低的价格就可以获得业内一线开发人员的答疑解惑。

    与其在群里面提问石沉大海,不如来星球有问必答,而且这个价格还是管一年的哦,一年的时间可以说是相当划算了。

    一些干货教程也正在准备中,马上要和大家见面了!!!

    想要加入的可以通过扫如下二维码进星球哦,iPhone 用户如果不能访问小程序的话,也可以加我微信 ezglumes 拉你进星球。

    在星球里经常被问到的问题,想从事(入门或者转行)音视频开发,要怎么做?

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

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

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

    1. 针对自己的情况,现阶段要从事音视频开发吗?这是一个关于利弊分析的问题,也是特别实际,很现实的问题。

    2. 已经决定从事音视频开发,要怎么去做呢?这是一个学习路线的问题,也是我个人的经验可以给到帮助的问题。

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

    在之前也做过音视频工作经验的视频分享,帮忙大家更多的了解音视频工作。

    音视频开发工作经验分享 || 视频版

    可以在 B 站中直接看,地址如下:

    https://www.bilibili.com/video/BV1p54y1X7fY

    要不要从事音视频开发

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

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

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

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

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

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

    另外,由于星球内的朋友或者关注公众号的朋友大多数是从事移动开发的,经常会有一个误区,把音视频开发认为是安卓的一个分支,我是非常不认同这个观念的。

    我的观点是 音视频开发也可以是一个独立的分支,不一定要和 Android 、iOS 联系上的。和信息安全行业一样,也分移动安全、Web 安全、云安全等,不同的安全领域有可能差异很大,但还是都属于信息安全范畴,音视频同样如此。

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

    如果你很熟练 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 等各种库完成音视频的编解码操作等
    6. .....

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

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

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

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

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

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

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

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

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

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

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

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

    3. 架构

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

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

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

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

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

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

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

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

    4. 实践

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

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

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

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

    如果你在实践中遇到的问题,也欢迎加入音视频开发进阶 知识星球,提供专业的答疑和干货内容。

    这两天肝完了,时间有点仓促,其实还有很多可以讲的,欢迎大佬一起交流讨论~~

    1 条回复    2022-03-29 14:33:18 +08:00
    pipilu
        1
    pipilu  
       187 天前
    不要转
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2007 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 07:00 · PVG 15:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.