专栏首页音视频技术码代码,到白头|专访SRS创始作者&阿里云RTC服务器团队负责人杨成立

码代码,到白头|专访SRS创始作者&阿里云RTC服务器团队负责人杨成立

Code never lies, comments sometimes do; Code never lies, people sometimes do.

人会说谎,或多或少,或有意或无意,但好的代码不会说谎。屏幕上的一行行字符给人兴奋感,给人贴心感,给人世俗意义的快乐,也给人世俗之外的领悟。

本文由LiveVideoStack与杨成立的采访整理而成

int main()

/* Program starts here */

2009年,我刚刚进入视频行业,从Flash播放器开始做起,也做过FFmpeg转码服务器。2012年,ChinaCache如日中天,要做CDN自研的视频服务器,我也就开始做视频服务器。

到2013年底,我开始做开源视频服务器SRS。

从进入视频行业开始,我就一直很幸运,在每个公司都有被信任和委以重任。特别感谢ChinaCache的付亮,不仅给我从0到1做视频CDN的机会,还不时在管理上启蒙我;感谢观止创想的杨默涵、雷健和于冰给予我的信任,让我负责技术团队,经历过的人才知道,创业维艰,信任无间;感谢叔度引荐我进入高手如云的阿里,开启了我从直播到WebRTC的技术新旅程。

我最初也是看着Nginx的代码写的视频服务器,但做到级联时遇到了复杂状态机的问题,由于epoll异步回调导致服务器逻辑变得特别复杂。

当时我就去请教了ChinaCache的技术大神Michael Talyansky,他告诉我状态机应该用coroutine解决,coroutine不是进程也不是线程......大神看我仍然一脸懵逼,又补充道:可以认为coroutine就是线程,不过没有锁切换开销也没有竞争条件。

回去之后我补了很久的功课,了解了coroutine的详细实现,并且用coroutine改写了视频服务器,才发现这招果然简单有效、直达痛点。这让我认识到人外有人,天外有天,只有踏实努力,不断进步,才能体会到技术的乐趣。

/* in a galaxy far far away */

我从2013年底开始做SRS,本来只想做个编码器收流的服务器,后来随着直播需求的爆发,关注的人越来越多,SRS的功能自然也就越加越多。

2015年底,SRS1.0发布。不过,关注度比较高的还是2017年左右发布的SRS2.0,实际上SRS2.0在2016年就基本成型了,只是一直在完善稳定性,所以就迟迟没有发布。

2019年底,SRS3.0发布。这一次,SRS基本具备了直播领域视频服务器应该有的核心功能。直播本质上是互联网的在线娱乐视频,随着互联网基础设施的完善(CDN、云计算和浏览器)而大放异彩,进而在各行各业都得到了广泛的应用,比如秀场、电商、教育、广电等等。

2020年初,SRS4.0有了质的飞跃,开始支持K8S部署和核心协议覆盖,协议支持了SRT、GB28181和WebRTC。这在很大程度上,是因为互联网基础设施的进一步完善,是互联网进一步向其他领域渗透的结果。比如SRT是应用在广电和远距离传输领域,GB28181是监控和智能家居领域,WebRTC则是最近热度很高的视频会议领域。

这7年来,我所经历的最大的困境,是一直在想:SRS是否应该存在?直播的发展、SRS的架构是否已经走到了尽头?

但经过了这几年,我觉悟到,没有走到尽头的开源项目和技术,只有走到尽头的意志和想法——战斗以战斗意志丧失为终止,开源以初心不灭为重生。这才有了SRS4.0的诞生,以及另外4位新加入的Maintainers。现在,SRS的更新速度已经超过了2013年的初创期。

//

// Dear Maintainers:

//

最初的Maintainer只有我和文杰大神。文杰是我在ChinaCache的同事,我离职后,他接替我继续维护和研发CDN视频服务器。

文杰对技术的敏感度高,又有很大的开发热情。有一次公司Outing去海边玩,闲聊时,文杰就问我视频服务器有哪些技术难点(我当时在从0到1研发视频服务器)。

后来文杰去了学而思,每隔一阵儿就听他说又搞定了一个啥,想要在业内做到最好。每次见面,文杰都说要回来搞搞SRS了,再不搞就老了。

SRT的Maintainer是施维大神,施维也是我在观止的同事。当时我创业已经有几个年头了,开始心生退意,觉得有些技术难点自己搞不动了。但施维大神来了之后,一个人解决了很多难题,不仅技术好,人也踏实。

几年后,闲聊时,他提起自己在搞SRT,我们就开始讨论SRS集成libsrt可能会遇到的问题,因为libsrt开线程了。后来他解决了这个问题,把libsrt集成到了SRS,而且改了FFmpeg,支持了动态编码。因为SRT在SRS上只是一个环节,关键还是要在编码器上降低码率。

GB28181的Maintainer是夏立新大神。立新关注SRS比较久,写了不少总结资料,画了不少图,这些被分享到群里后,当时也轰动了一把。一直以来,SRS都是使用文档多,程序结构文档少,所以大家对于SRS的实现分析和总结文档还是很喜闻乐见的。

监控一直是视频行业很重要的一部分,之前和田野大神聊如何支持监控,田野说要支持GB28181,还做了详细的分析。后来,我就在群里鼓励大家在SRS上支持GB28181,立新就默默的把代码给码出来了。

其实立新现在并没有在做监控,而是转做WebRTC了,不过他之前做监控比较久,技术扎实而且热爱技术,尤其代码码得好。

WebRTC的Maintainer有三位:肖志宏大神、B神和刘连响大神。服务器主要是志宏在做,B神是Opus转AAC,连响是Native客户端和信令协议。

志宏我很早就认识了,当时有人要在ARM上跑SRS,需要写汇编支持setjmp和longjmp,志宏在群里说这个应该可以搞,大师兄接着说代码得码出来才算数。结果过了没多久,志宏就把汇编搞定了。WebRTC的难度也是最高的,但宏神2周搞定了播放,3周就搞定了推流,封神之路就是这么简单。

Maintainer有一个钉钉群,我们会详细交流每次提交,比较复杂的问题还会拉视频会议一起交流,这个群的名字叫做"SRS造风者"。盘古开天辟地时并没有风,大神说要有风,所以大地就有了风。我们也是希望能给视频行业做出一点积极的贡献。

我以前觉得开源项目能展示自己的技术能力,按照自己对技术的理解和技术理想来构建一个可以长期发展的产品,最近和众大神一起码代码、交流技术,让我觉得开源项目最大的乐趣其实在于能和一群牛逼的人一起做一点有价值有意义的事。

#define TRUE LIFE

//Tech is so much fun

LiveVideoStack的采访大纲里有问我的daily routine,那么我的作息算是比较规律的,平常起得也比较早,正常情况6点半就起床锻炼身体了。年纪大了,不锻炼的效果立竿见影现世报。

一般的上班时间都是9点多,但也因为我起得早,8点左右我就能到公司,也就拥有了1小时左右完全属于自己的时间,这段时间我会做一些长期以来想要完成的事情,比如以前就是学口语,还有补补课、码SRS代码,或者了解一些别的技术。

无论是在工作还是生活中,我都尽力保持乐观。我理解的乐观,是知道无路可走还在努力并且能够乐在其中,而不是知道熬一熬就有个大饼,所以才暂时委屈下自己。知道委屈一下就有张大饼,傻子都能够保持乐观;而真正的乐观,是自己真的已经知道无路可走了,还是要一如既往的努力和乐观。

我所理解的技术有一种乐趣,是一种专业的乐趣。商业产品谁家好,有时候很难说得清,而开源项目好不好,拉出来看看就知道了,一种茹毛饮血的原始力量,不加修饰的直白,按在地上摩擦的野蛮,不然呢?

LivevideoStack的总编包研说得很对,还是应该多讲讲自己的想法,比如为什么要做SRS这个项目,未来怎么发展等等。特别是现在,大风起兮,全球应疫而生的视频业务都在爆发,相比之下,2015年的直播爆发只是国内的事情。这时候,SRS不出来刷刷存在感,那就属于逆势而为了——一个优秀的开源项目一定蕴含光芒,风起云涌时就要光芒四射,照亮人心。(这句话我们借用到了LiveVideoStackCon 2020大会文案中:风起云涌时,亦是光芒四射时 | LiveVideoStackCon 2020线上峰会日程全公开

/*

* TODO:Remove this function

*/

我希望自己能码代码到头发全白,呃......至少白一半吧,给大家证明下老头子也能写代码。所以现在每天发愁,为什么头发还不快点白。自从开始搞WebRTC,看RFC协议,视力下降得非常快,我怕我头发没白眼睛先瞎了,那样就没法儿自证预言了。

SRS接下来最难的,就是一个“取舍”的问题。到今天,已经加了不少东西进SRS了,有些东西肯定是要舍弃的,没有舍就没有得,不会舍就不能得。加法比减法好做,减法也更容易做错,之前放弃过交叉编译脚本,结果被社区提issue提怕了,又给加了回来了。

其实没有人能预见未来,开源项目应当码好代码,不避锋芒,不媚逢迎,不辞风雨,不患得失,不畏将来,不念过往。

《C程序设计语言(The C Programming Language)》的共同作者之一Brian Kernighan那一句“Don't comment bad code — rewrite it”至今仍被奉为金科玉律,这大概是基于“comments do not make up for bad code ”的逻辑。同样,简洁干净的代码speak for themselves,懂的自然懂,不懂的运行之后也一样能懂。

代码如此,写代码的人却不同。人生如同一场电影,当我们回首往事时,常常忘了剧中人物都有哪些,所以,每一个场景都需要做许多注脚。今天,LiveVideoStack有机会为SRS做一个小小的注脚,感到既惶恐又幸运。

编辑:Coco Liang

图片来源:《星际穿越》

本文分享自微信公众号 - LiveVideoStack(livevideostack),作者:杨成立

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何构建分布式SFU/MCU媒体服务器?

    大家好,我是来自英特尔上海研发中心的段先德。从2014年开始主要做基于WebRTC的实时通信和统一通信解决方案。对于实时通讯来说WebRTC技术是一个革命性的存...

    LiveVideoStack
  • 开源流媒体服务器:为何一定得再撸个新的

    https://www2.tutormeetplus.com/v2/render/playback?mode=playback&token=7955f5f3e1...

    LiveVideoStack
  • 当SRS遇到K8s:如何构建海量推流源站?

    Origin Cluster通过配置其他源站的信息,在本源站没有流时查询到流的位置,通过RTMP302定向到指定源站,具体原理可以参考#464。主要应用场景如下...

    LiveVideoStack
  • 蓝桥杯嵌入式之扩展板数码管、ADC按键讲解

    蓝桥杯嵌入式扩展板有三个共阴数码管,用3个74LS595来控制。74LS595是串/并转换,在时钟信号的作用下,将串口输入的8个高低电平锁存到芯片中并并行输出。...

    用户5935416
  • 剑指offer——删除链表中重复的结点

    AI那点小事
  • kafka.common.KafkaException: Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instan

    别先生
  • ES6系列_11之Set和WeakSet数据结构

    Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重。

    wfaceboss
  • Leetcode 83 Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear...

    triplebee
  • routed Port vs SVI

    背景:三层交换机的e0/0要工作在三层模式与另一网络设备连接。可以选择的配置方式有两种, 1、routed Port,指在cisco switch中端口模式下...

    py3study
  • 原 yield用法分析

    魂祭心

扫码关注云+社区

领取腾讯云代金券