码代码,到白头|专访SRS创始作者阿里云RTC服务器团队负责人杨成立
Code never lies, comments sometimes do;?Code never lies, people sometimes do.
人會(huì)說(shuō)謊,或多或少,或有意或無(wú)意,但好的代碼不會(huì)說(shuō)謊。屏幕上的一行行字符給人興奮感,給人貼心感,給人世俗意義的快樂,也給人世俗之外的領(lǐng)悟。
本文由LiveVideoStack與楊成立的采訪整理而成
int main()
/* Program starts here */
2009年,我剛剛進(jìn)入視頻行業(yè),從Flash播放器開始做起,也做過FFmpeg轉(zhuǎn)碼服務(wù)器。2012年,ChinaCache如日中天,要做CDN自研的視頻服務(wù)器,我也就開始做視頻服務(wù)器。
到2013年底,我開始做開源視頻服務(wù)器SRS。
從進(jìn)入視頻行業(yè)開始,我就一直很幸運(yùn),在每個(gè)公司都有被信任和委以重任。特別感謝ChinaCache的付亮,不僅給我從0到1做視頻CDN的機(jī)會(huì),還不時(shí)在管理上啟蒙我;感謝觀止創(chuàng)想的楊默涵、雷健和于冰給予我的信任,讓我負(fù)責(zé)技術(shù)團(tuán)隊(duì),經(jīng)歷過的人才知道,創(chuàng)業(yè)維艱,信任無(wú)間;感謝叔度引薦我進(jìn)入高手如云的阿里,開啟了我從直播到WebRTC的技術(shù)新旅程。
我最初也是看著Nginx的代碼寫的視頻服務(wù)器,但做到級(jí)聯(lián)時(shí)遇到了復(fù)雜狀態(tài)機(jī)的問題,由于epoll異步回調(diào)導(dǎo)致服務(wù)器邏輯變得特別復(fù)雜。
當(dāng)時(shí)我就去請(qǐng)教了ChinaCache的技術(shù)大神Michael Talyansky,他告訴我狀態(tài)機(jī)應(yīng)該用coroutine解決,coroutine不是進(jìn)程也不是線程......大神看我仍然一臉懵逼,又補(bǔ)充道:可以認(rèn)為coroutine就是線程,不過沒有鎖切換開銷也沒有競(jìng)爭(zhēng)條件。
回去之后我補(bǔ)了很久的功課,了解了coroutine的詳細(xì)實(shí)現(xiàn),并且用coroutine改寫了視頻服務(wù)器,才發(fā)現(xiàn)這招果然簡(jiǎn)單有效、直達(dá)痛點(diǎn)。這讓我認(rèn)識(shí)到人外有人,天外有天,只有踏實(shí)努力,不斷進(jìn)步,才能體會(huì)到技術(shù)的樂趣。
/* in a galaxy far far away */
我從2013年底開始做SRS,本來(lái)只想做個(gè)編碼器收流的服務(wù)器,后來(lái)隨著直播需求的爆發(fā),關(guān)注的人越來(lái)越多,SRS的功能自然也就越加越多。
2015年底,SRS1.0發(fā)布。不過,關(guān)注度比較高的還是2017年左右發(fā)布的SRS2.0,實(shí)際上SRS2.0在2016年就基本成型了,只是一直在完善穩(wěn)定性,所以就遲遲沒有發(fā)布。
2019年底,SRS3.0發(fā)布。這一次,SRS基本具備了直播領(lǐng)域視頻服務(wù)器應(yīng)該有的核心功能。直播本質(zhì)上是互聯(lián)網(wǎng)的在線娛樂視頻,隨著互聯(lián)網(wǎng)基礎(chǔ)設(shè)施的完善(CDN、云計(jì)算和瀏覽器)而大放異彩,進(jìn)而在各行各業(yè)都得到了廣泛的應(yīng)用,比如秀場(chǎng)、電商、教育、廣電等等。
2020年初,SRS4.0有了質(zhì)的飛躍,開始支持K8S部署和核心協(xié)議覆蓋,協(xié)議支持了SRT、GB28181和WebRTC。這在很大程度上,是因?yàn)榛ヂ?lián)網(wǎng)基礎(chǔ)設(shè)施的進(jìn)一步完善,是互聯(lián)網(wǎng)進(jìn)一步向其他領(lǐng)域滲透的結(jié)果。比如SRT是應(yīng)用在廣電和遠(yuǎn)距離傳輸領(lǐng)域,GB28181是監(jiān)控和智能家居領(lǐng)域,WebRTC則是最近熱度很高的視頻會(huì)議領(lǐng)域。
這7年來(lái),我所經(jīng)歷的最大的困境,是一直在想:SRS是否應(yīng)該存在?直播的發(fā)展、SRS的架構(gòu)是否已經(jīng)走到了盡頭?
但經(jīng)過了這幾年,我覺悟到,沒有走到盡頭的開源項(xiàng)目和技術(shù),只有走到盡頭的意志和想法——戰(zhàn)斗以戰(zhàn)斗意志喪失為終止,開源以初心不滅為重生。這才有了SRS4.0的誕生,以及另外4位新加入的Maintainers。現(xiàn)在,SRS的更新速度已經(jīng)超過了2013年的初創(chuàng)期。
//
// Dear Maintainers:
//
最初的Maintainer只有我和文杰大神。文杰是我在ChinaCache的同事,我離職后,他接替我繼續(xù)維護(hù)和研發(fā)CDN視頻服務(wù)器。
文杰對(duì)技術(shù)的敏感度高,又有很大的開發(fā)熱情。有一次公司Outing去海邊玩,閑聊時(shí),文杰就問我視頻服務(wù)器有哪些技術(shù)難點(diǎn)(我當(dāng)時(shí)在從0到1研發(fā)視頻服務(wù)器)。
后來(lái)文杰去了學(xué)而思,每隔一陣兒就聽他說(shuō)又搞定了一個(gè)啥,想要在業(yè)內(nèi)做到最好。每次見面,文杰都說(shuō)要回來(lái)搞搞SRS了,再不搞就老了。
SRT的Maintainer是施維大神,施維也是我在觀止的同事。當(dāng)時(shí)我創(chuàng)業(yè)已經(jīng)有幾個(gè)年頭了,開始心生退意,覺得有些技術(shù)難點(diǎn)自己搞不動(dòng)了。但施維大神來(lái)了之后,一個(gè)人解決了很多難題,不僅技術(shù)好,人也踏實(shí)。
幾年后,閑聊時(shí),他提起自己在搞SRT,我們就開始討論SRS集成libsrt可能會(huì)遇到的問題,因?yàn)閘ibsrt開線程了。后來(lái)他解決了這個(gè)問題,把libsrt集成到了SRS,而且改了FFmpeg,支持了動(dòng)態(tài)編碼。因?yàn)镾RT在SRS上只是一個(gè)環(huán)節(jié),關(guān)鍵還是要在編碼器上降低碼率。
GB28181的Maintainer是夏立新大神。立新關(guān)注SRS比較久,寫了不少總結(jié)資料,畫了不少圖,這些被分享到群里后,當(dāng)時(shí)也轟動(dòng)了一把。一直以來(lái),SRS都是使用文檔多,程序結(jié)構(gòu)文檔少,所以大家對(duì)于SRS的實(shí)現(xiàn)分析和總結(jié)文檔還是很喜聞樂見的。
監(jiān)控一直是視頻行業(yè)很重要的一部分,之前和田野大神聊如何支持監(jiān)控,田野說(shuō)要支持GB28181,還做了詳細(xì)的分析。后來(lái),我就在群里鼓勵(lì)大家在SRS上支持GB28181,立新就默默的把代碼給碼出來(lái)了。
其實(shí)立新現(xiàn)在并沒有在做監(jiān)控,而是轉(zhuǎn)做WebRTC了,不過他之前做監(jiān)控比較久,技術(shù)扎實(shí)而且熱愛技術(shù),尤其代碼碼得好。
WebRTC的Maintainer有三位:肖志宏大神、B神和劉連響大神。服務(wù)器主要是志宏在做,B神是Opus轉(zhuǎn)AAC,連響是Native客戶端和信令協(xié)議。
志宏我很早就認(rèn)識(shí)了,當(dāng)時(shí)有人要在ARM上跑SRS,需要寫匯編支持setjmp和longjmp,志宏在群里說(shuō)這個(gè)應(yīng)該可以搞,大師兄接著說(shuō)代碼得碼出來(lái)才算數(shù)。結(jié)果過了沒多久,志宏就把匯編搞定了。WebRTC的難度也是最高的,但宏神2周搞定了播放,3周就搞定了推流,封神之路就是這么簡(jiǎn)單。
Maintainer有一個(gè)釘釘群,我們會(huì)詳細(xì)交流每次提交,比較復(fù)雜的問題還會(huì)拉視頻會(huì)議一起交流,這個(gè)群的名字叫做"SRS造風(fēng)者"。盤古開天辟地時(shí)并沒有風(fēng),大神說(shuō)要有風(fēng),所以大地就有了風(fēng)。我們也是希望能給視頻行業(yè)做出一點(diǎn)積極的貢獻(xiàn)。
我以前覺得開源項(xiàng)目能展示自己的技術(shù)能力,按照自己對(duì)技術(shù)的理解和技術(shù)理想來(lái)構(gòu)建一個(gè)可以長(zhǎng)期發(fā)展的產(chǎn)品,最近和眾大神一起碼代碼、交流技術(shù),讓我覺得開源項(xiàng)目最大的樂趣其實(shí)在于能和一群牛逼的人一起做一點(diǎn)有價(jià)值有意義的事。
#define TRUE LIFE
//Tech is so much fun
LiveVideoStack的采訪大綱里有問我的daily routine,那么我的作息算是比較規(guī)律的,平常起得也比較早,正常情況6點(diǎn)半就起床鍛煉身體了。年紀(jì)大了,不鍛煉的效果立竿見影現(xiàn)世報(bào)。
一般的上班時(shí)間都是9點(diǎn)多,但也因?yàn)槲移鸬迷?#xff0c;8點(diǎn)左右我就能到公司,也就擁有了1小時(shí)左右完全屬于自己的時(shí)間,這段時(shí)間我會(huì)做一些長(zhǎng)期以來(lái)想要完成的事情,比如以前就是學(xué)口語(yǔ),還有補(bǔ)補(bǔ)課、碼SRS代碼,或者了解一些別的技術(shù)。
無(wú)論是在工作還是生活中,我都盡力保持樂觀。我理解的樂觀,是知道無(wú)路可走還在努力并且能夠樂在其中,而不是知道熬一熬就有個(gè)大餅,所以才暫時(shí)委屈下自己。知道委屈一下就有張大餅,傻子都能夠保持樂觀;而真正的樂觀,是自己真的已經(jīng)知道無(wú)路可走了,還是要一如既往的努力和樂觀。
我所理解的技術(shù)有一種樂趣,是一種專業(yè)的樂趣。商業(yè)產(chǎn)品誰(shuí)家好,有時(shí)候很難說(shuō)得清,而開源項(xiàng)目好不好,拉出來(lái)看看就知道了,一種茹毛飲血的原始力量,不加修飾的直白,按在地上摩擦的野蠻,不然呢?
LivevideoStack的總編包研說(shuō)得很對(duì),還是應(yīng)該多講講自己的想法,比如為什么要做SRS這個(gè)項(xiàng)目,未來(lái)怎么發(fā)展等等。特別是現(xiàn)在,大風(fēng)起兮,全球應(yīng)疫而生的視頻業(yè)務(wù)都在爆發(fā),相比之下,2015年的直播爆發(fā)只是國(guó)內(nèi)的事情。這時(shí)候,SRS不出來(lái)刷刷存在感,那就屬于逆勢(shì)而為了——一個(gè)優(yōu)秀的開源項(xiàng)目一定蘊(yùn)含光芒,風(fēng)起云涌時(shí)就要光芒四射,照亮人心。(這句話我們借用到了LiveVideoStackCon 2020大會(huì)文案中:風(fēng)起云涌時(shí),亦是光芒四射時(shí)?|?LiveVideoStackCon?2020線上峰會(huì)日程全公開)
/*
?* TODO:Remove this function
? */
我希望自己能碼代碼到頭發(fā)全白,呃......至少白一半吧,給大家證明下老頭子也能寫代碼。所以現(xiàn)在每天發(fā)愁,為什么頭發(fā)還不快點(diǎn)白。自從開始搞WebRTC,看RFC協(xié)議,視力下降得非常快,我怕我頭發(fā)沒白眼睛先瞎了,那樣就沒法兒自證預(yù)言了。
SRS接下來(lái)最難的,就是一個(gè)“取舍”的問題。到今天,已經(jīng)加了不少東西進(jìn)SRS了,有些東西肯定是要舍棄的,沒有舍就沒有得,不會(huì)舍就不能得。加法比減法好做,減法也更容易做錯(cuò),之前放棄過交叉編譯腳本,結(jié)果被社區(qū)提issue提怕了,又給加了回來(lái)了。
其實(shí)沒有人能預(yù)見未來(lái),開源項(xiàng)目應(yīng)當(dāng)碼好代碼,不避鋒芒,不媚逢迎,不辭風(fēng)雨,不患得失,不畏將來(lái),不念過往。
《C程序設(shè)計(jì)語(yǔ)言(The C Programming Language)》的共同作者之一Brian Kernighan那一句“Don't comment bad code — rewrite it”至今仍被奉為金科玉律,這大概是基于“comments do not make up for bad code ”的邏輯。同樣,簡(jiǎn)潔干凈的代碼speak for themselves,懂的自然懂,不懂的運(yùn)行之后也一樣能懂。
代碼如此,寫代碼的人卻不同。人生如同一場(chǎng)電影,當(dāng)我們回首往事時(shí),常常忘了劇中人物都有哪些,所以,每一個(gè)場(chǎng)景都需要做許多注腳。今天,LiveVideoStack有機(jī)會(huì)為SRS做一個(gè)小小的注腳,感到既惶恐又幸運(yùn)。
編輯:Coco Liang
圖片來(lái)源:《星際穿越》
總結(jié)
以上是生活随笔為你收集整理的码代码,到白头|专访SRS创始作者阿里云RTC服务器团队负责人杨成立的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风起云涌时,亦是光芒四射时 | Live
- 下一篇: 【线上直播】ICASSP论文解读 | 智