结束语 跳出舒适区,拥抱变化
你好,我是展晓凯。
这是专栏的最后一讲,感谢你一路的支持和陪伴。
从7月25日课程上线到现在,历经一个多月的时间,课程已经接近尾声了,在过去的几个月里,从筹备到上线,我竟然也习惯了每日深夜写稿、录制音频,还有和评论区的你一起交流讨论,真的到了结束的这一刻也有些依依不舍。课程虽然结束了,但我们还是要带着从这个专栏收获的能量走好接下来的路。
再聊音视频开发
回顾我们整个专栏,其实是围绕着录播这个场景完成了两个实战项目,一个是视频播放器,一个是视频录制器。
为了完成视频播放器和视频录制器,我们学习了音视频的采集、渲染、编解码、封装、音视频同步等相关知识。最后我们成功构造出了视频播放器项目和视频录制器项目。
这两个项目的完整源码我会放到GitHub上开源出来,你也可以再对着课程仔细研究研究,看看怎么让项目代码跑起来。我相信通过这两个项目,你已经对移动端音视频开发建立了比较系统的认识了。
但是如果再回到我们最开始说的录播场景,只靠着这两个项目还不足以支撑构建起整个录播场景,因为在录播场景中还有两个经典项目,就是视频编辑器与视频保存器,不过这两个项目是可以由视频播放器改造而来的,加上这两个项目,录播场景的雏形就已经出来了,你可以对照着我画的示意图来理解。
为什么说是一个雏形呢?因为要想做好录播场景,还必须要掌握音视频处理相关的知识。
- 音频处理,包括3A(AEC、AGC、ANS)的处理,混音效果器(Equalizer、Reverb、Compressor),变速不变调、变调不变速的音频效果器等。
- 视频处理,包括贴纸、磨皮、美颜、主题等处理,也包含一些画中画、视频增强等。
在你的系统里按需加入这些模块,就可以构建起一个可以上线的录播场景了,上面说的音视频处理并不是需要你或者你的团队亲自上阵,从无到有地开始书写,接入第三方SDK也是可以的,只要我们整个音视频的架构扩展性足够强,哪一种实现手段更快选择哪一种就可以了。
除了录播场景外,直播场景也非常重要,前面也讲过直播场景主要就是推流器和拉流器,推流器可以在视频录制器的基础上进行改造,拉流器可以在视频播放器的基础上进行改造。直播场景最大的特点就是主播和观众的延时不能太大,现在主流的直播都是互动直播,双方的延时越小越好,所以直播场景下最重要的部分就是传输协议。
之前最通用的就是主播端使用RTMP协议推流,观众段拉取HTTP+FLV的视频进行观看。现在很多厂商的上行推流协议都迁移到UDP协议了,比如quic、srt、WEBRTC,这样可以让主播通过最小延时把内容推流到边缘服务器节点,然后通过流媒体服务器的内部高通网络分发到拉流的边缘节点,现在拉流端的很多厂商也逐渐接入UDP协议来降低延迟。
在整个链路上,通过各种NACK、Fec、JitterBuffer来抗网络抖动和丢包,让整个链路更加平稳,延时也更小。当然不同的业务场景也要根据自身情况来选择合理的架构,比如,普通直播可能选择RTMP+HTTP/FLV就够了,强互动直播就需要使用RTC,所以了解整个直播场景以及架构也是非常重要的,这能够帮助我们为自己的业务选择合理的架构,降低成本。
音视频相关的内容我们已经讲了很多,我也尽可能地把我这些年积攒的经验通过这个专栏传递给你了,但因为行业是不断发展向前的,学习也是永无止境的,所以我们要时刻保持一个开放的态度,拥抱变化,不断吸纳新的知识,接受新的挑战。
所以,最后我想从个人成长的角度和你聊一下,作为一个工程师,我们自己的增长飞轮。
工程师的增长飞轮是什么?
我认为我们工程师的增长飞轮就是“工程思维”,那什么是“工程思维”呢?我的理解它是一种高效解决问题的思维模型,虽然我不能给出一个准确的定义,但它确实是可训练、可培养的,下面我们就用“工程思维”模型来看一下如何解决一个问题。
首先要去发现或定义这个问题,不要小看问题的定义,因为问题的定义是在描述这个事情的边界和最终的目标,只有问题定义清楚并且大家达成共识之后,才可以继续走向下一步。
接下来就是使用工具来分析问题,这一步最重要的是“工具”,你掌握的工具的数量和熟练程度是这一步的关键。如果你对工具的使用方法足够熟练,那么在同样的时间内,你会比别人思考得更深入、角度也会更多样。
有了前两步的基础之后,就可以来到最后一步了,最后一步其实分为两点,一是解决问题,这一点很重要,如果最终不能解决问题那就没有任何意义;二是形成产品,目的是系统化地解决问题,保证类似问题或者由此引发的问题不会再出现。
基于上面这个“工程思维”的模型,你可以思考一下,我们怎么在技术迭代与更新中做到充实自己,同时又能给业务带来价值呢?我总结了几点经验来分享给你。
- 一是系统了解业界的最优路径,因为很多事情都是你之前没接触过的,这个时候要保持头脑开放,抛弃自己已有的知识,放下防护,接受新的变化。想办法跟行业的大牛去交流、阅读行业相关的著作、去看业内最成熟的产品,找到这个行业最优路径去学习。
- 二是分清目标和手段,这一点很重要,其实自己是当事人的时候就很容易陷入这个误区,一定要分清目标是什么,再去谈实现手段,而不是使用简单的手段去实现另外一个目标,那就没有任何意义了。
- 三是要善于给自己设立跳一跳就够得着的目标,这种目标是可以让你做了之后有进步,同时失败概率又不会太大,这样可以刺激你不断学习进步,给你很多正反馈,然后形成一个寻找最低目标-执行-反馈的良性循环,让自己的系统进化。
希望你在这个专栏中不单单可以系统学习到音视频相关的知识,还可以进化自己的思维,让自己可以跳出舒适区,不断拥抱变化,蜕变为一个积极向上、充满正能量的人。也希望你可以利用学到的知识和方法给自己的业务带来增长,让自己获得更多的回报。
不知不觉又说了这么多了,就像在课程中我总是忍不住增加内容,其实是因为担心你在理解上产生困难,又或者是遇到实际问题的时候不知道怎么去解决,所以从心底里还是希望你能在有限的时间内学到更多的东西。但天下没有不散的宴席,希望你之后无论身处哪里,都可以贡献出自己的价值,我们江湖再见。
最后,文末有一份结课问卷,希望你可以花两分钟的时间填写一下。我会认真倾听你对这个专栏的意见或建议,期待你的反馈!
注:GitHub地址,内含项目源码:https://github.com/zhanxiaokai
- peter 👍(6) 💬(1)
我是音视频小白,从头到尾跟着老师的专栏学了一遍。学完后,虽然还有点懵懂,但基本了解了音视频这一块内容,构建起了音视频的知识体系,和刚开始的时候已经大不相同了,自己感觉收获很大。非常感谢老师!老师经验丰富,文章写得很好,希望以后还能看到老师的课程。
2022-09-14 - 梦的点滴 👍(0) 💬(1)
老师好,之前一直看的您的那本书,主要看安卓部分,项目中也成功运用了。就是最近在看iOS部分的框架,包括filter部分,但因为iOS开发不熟悉,想有个代码参考调试一下,但发现github上没有八九十章节的源码,期望看到后能否补充一下,感谢老师
2022-11-17 - Ztiany 👍(0) 💬(1)
老师你好,看到项目中使用的 native 库为如下方式: libavfilter.a libavformat.a libavcodec.a libpostproc.a libswresample.a libswscale.a libavutil.a libpostproc.a libfdk-aac.a libvo-aacenc.a libx264.a 都被编译为了静态库,我的疑问是:这里的 ffmpeg 是怎么编译的? 具体来说就是,我看到网络上讲解的 ffmpeg 编译都是将 x264 和 fdk-aac 直接编译到 ffmpeg 里面,然后就可以在 ffmpeg 里面使用相关的编码器。而像上面这种集成方式,x264 和 fdk-aac 库的链接放到了 Android 项目里,那么在编译这个项目使用的 ffmpeg 时,是否要做什么处理,才能让 ffmpeg 知道有 x264 和 fdk-aac 这些编码器呢?
2022-09-14 - 一个正直的小龙猫 👍(0) 💬(1)
想问问老师, 如果去快手面试移动端音视频岗位,需要哪些知识储备,老师学的这门课够不够用?
2022-09-14 - peter 👍(0) 💬(3)
请教老师几个问题: Q1:视频编辑器与视频保存器是否有开源实现? 文中提到了视频编辑器与视频保存器,能否推荐一个开源实现?比如,github上也许已经存在的开源代码。(移动端的开源实现) Q2:安卓系统自身的哪个API可以获取音频文件的时长? 安卓平台的音频处理,专栏中讲了五种方法:Java层的MediaPlayer、SourdPool、AudioTrack,以及NDK层的OpenSL ES、AAudio。现在我需要获取一个音频文件的时长,只给出此文件的路径,哪一个模块可以实现? Q3:给视频配上另外一段台词,声音不变,有这样的软件吗?前一段看到一个视频,是射雕中的视频,是郭靖在说话。台词变了,但声音没有变,还是郭靖的声音,但台词换成搞笑的词了。这是怎么做出来的? 是软件做的吗? 还是说是请人配的音? Q4:NDK层的音频渲染,有OpenSL ES和AAudio两种,适用于不同的安卓版本。那么,做产品的时候,怎么适配?在代码中判断手机的版本,根据版本分别使用OpenSL ES和AAudio吗?
2022-09-14 - geek 👍(0) 💬(1)
老师,有没有学习的微信群?
2022-09-14 - 在梦上 👍(0) 💬(0)
凯哥,你的书我也买了,里面第十章关于使用硬解码替换的软解码的那部分源码找不到呀 能发我一份不?iOS的
2023-03-01