本文系微信公众号和知乎专栏《MediaStack》原创文章,欢迎大家关注,随时进行交流。

     本文不是广告,是自己的一些心得,如果您是工作3年以上,对Android方向有明确的目标就直接划走,如果您是在校学生还处在学习阶段,或者刚入职场1~3年,亦或者想要在Android方向想要转到音视频赛道的,可以继续深入看下去。

    最近有收到小伙伴的私信和留言,公司内也有带毕业生的经历,新人也想要进入音视频开发这个赛道,想要把我这个前浪拍死在沙滩上,毕竟内卷化这么严重的程序员行业,多学点东西还是有好处的(不是你死(就业)就是我亡(失业))。所以这里总结一下自己的认知和踩坑之路,特别是从Android进阶的一些感悟。
    核心观点就是寻找初心,目标清晰,反馈激励,框架搭建
寻找初心
    我们学习任何一个新的东西,都是要有一个切入点,从这个点开始着手,然后由点到线,再由线拓展成面,学习音视频也是一样的,首先要找到一个对于自己来说比较适合的切入点。比如自己之前从事Android开发的,多多少少会接触MediaPlayer,那这个就是很好的切入点了。比如学校里面学习过信号、图像相关基础,这个就是非常好的基础了。再比如做过UI绘制相关工作,可以从渲染开始。
    有了这样一个切入点,我们就有了初衷,有了学习的基础。音视频基础知识是一个非常丰富、基础理论逐渐日常实践化的知识体系。比如日常中我们经常用微信进行语音通话、视频通话;我们用手机拍照、录制视频然后存储、转发;我们用app看视频进行分比率切换、倍速观看、跳转等操作;看直播带货、并和主播连麦、互动、刷礼物;我们在TV上看电视节目等等;心情好时发布一条视频动态,发布一条抖音短视频,或者自己直接做主播,随时随地发布vlog等等。所有这些都是充满我们日常行为习惯的音视频内容。而音视频开发就是为我们日常提供类似服务,保障和优化这些用户体验的有意思的工作。 
目标清晰
    有了初衷,还缺少一个目标;有目标才有的放矢,才能保持专注。比如我个人学习是因为喜欢看视频,想要了解更多知识;又比如学习是为了更好的做音视频剪辑,做更多优质的自媒体内容;再或者直接点学习音视频知识或者理论就是为了进入大厂,为了之后工作保障,不被时代淘汰。个人认为,这个是大部分人想要学习音视频的一个最现实的目标吧。有了这个目标,我们可以去boss,猎聘等招聘网站上查找心仪大厂对应的工作描述,这样就可以针对性地学习相关知识了。
    从个人自己的学习经历说起,虽然这是一条“赶巧”的路,但是中间某些关键节点,自己做了遵循内心的选择,至少目前看来是符合自己的预期。
    自己大学时代就对于电影电视比较感兴趣,所以在校期间会去图书馆看周边的一些书籍,这个在图书推荐的文章中有提到,感兴趣的可以去看一眼。记得大二学习计算机数电、大三学习单片机时,就对于各种信号的东西比较入迷。所以之后在图书馆自学了数字图像处理、还结合冈萨雷斯的教材,做了一些实验,有碰到不理解的地方就去网上查阅资料,直到逐步明白其中相关原理(当然数学公式没有完全理解透彻)。
反馈激励
    有人又说了:自己不知道自己喜欢上什么、暂时找不到兴趣切入点,不知道如何下手?
    其实这是兴趣爱好和工作目标差别的原因:该部分可以通过写博客、参与技术交流得到正反馈、工作中有效激励等手段慢慢培养。
    比如:看着程序员工资比较高,也想要进入大厂,这样就有了自己明确的目标:先要进入大厂,虽然这个很宽泛,但是这个起到激励的作用。那现在就需要进行细分化该目标,使之明确化、具象化、可执行化。想要进入大厂,就要更加明确:是要用音视频做什么?是想要音视频前端处理呢?想要音视频播放?想要音视频编解码?音视频算法优化?音视频传输?还是想要学术研究,参与音视频标准?目标不同,学习的内容也就不同,进入大厂工作就不同,对应的学习技术栈就有了很大差别了。这个可以针对目标大厂的工作JD进行相关知识的补充。
    比如涉及网络通信相关音视频框架:
    Android音视频相关的开发进阶可以从app入手,然后沿着上图中的路线完成整个流程的熟悉和积累,慢慢接触各种音视频的封装格式、Android的MediaPlayer架构、FFMPEG开源库、OpenOMX框架,音视频采集框架(Camera,tinyalsa)等。新手从识别MP4和".mp4"的区别开始,从app播放一个MP4文件开始;然后逐步掌握各种format封装、网络传输特性、接收端解码、屏幕显示等音视频编解码的框架,逐步熟悉本地文件和网络码流如何在Android系统中流转,如何进行不同平台软解、硬解的选择,如何进行不同分辨率切换显示。这时候你会发现自己俨然成为一个Android音视频开发工程师。或许这个阶段任务会比较枯燥,毕竟主要承担音视频功能优化和问题解决修复工作,没有真正涉及到需求开发或者新功能预研。
    主线:Android-->MediaPlayer Java-->MediaPlayer C-->OpenOMX
    副线:音视频封装格式-->音视频编解码-->音视频开源框架
框架搭建
    上一个阶段结束之后就可以依据自己的选择,或者公司业务进行具体方向的划分了。
(1)如果涉及显示或者特效相关的,可以深入学习opengl,或者Vulkan;
(2)如果涉及播放器相关的,可以深入调研各种播放器的特性,能够针对性优化,比如秒播,低延迟直播等等;
(3)如果涉及编解码的,可以深入学习H264,H265,H266,VP9,AV1等等编解码方式;
(4)如果涉及RTC的,可以深入学习各种网络协议,完成网络优化和分发等内容积累。
    每一个方向都可以深入学习下去,走向康庄大道,寻找到属于自己心仪的方向。这里我推荐一本书籍,也是自己正在看的:《在线视频技术精要》。这本书怎么说呢,评价两极分化非常严重。有工作经验的吐槽毫无技术难度:
小白感觉这就是前进的方向:
    该书在微信读书上就可以找到,个人看完之后的最大感受,这不就仅仅是把所有音视频概念堆积而成,完全不深入讲解,不建议购买。不过转而又一想,这可不就是大家翘首以待,梦寐以求的音视频方向的技术栈嘛。以前我也和大部分人一样想要类似这样的技术栈:

然而把《在线视频技术精要》该书整理一下,就是这样的技术栈了,而且非常全面:
    所以大家可以通过企业微信进行快速阅读,了解一个大概,然后针对每一个方向进行深入学习,都需要查看大量资料,深入学习论文或者spec,或者代码才能够完成。而该书则给我们指明了前进的方向。

    再次强调一下,个人认为该书不建议购买。可以作为工具书,微信读书通读一下就可以。
总结
    雷军说,零售的本质在于用户体验和运营效率。
    而刘强东认为:零售的本质一直都是成本、效率和体验,这一点从来没有变过。
    借用音视频行业大佬的一句话:而音视频的本质就是在各种极端复杂的环境下,能够充分利用各种终端硬件设备,给用户最好的音视频体验。Android的进阶方向也是类似的。音视频的功能开发和优化就是这样一个追求极致的过程:如何满足客户各种需求,如何提升客户细微体验,如何兼容各种软硬件,这才是我们做音视频的价值。哪怕一个很小很小的优化,也能够在产品特性和技术差异打磨上产生迭代。

我是一枚爱跑步的程序猿,很多内容属于自学内容,文中难免会出现一些错误或者不准确的地方,恳请大家批评指正。
继续阅读
阅读原文