入門或者轉行音視訊,應該要怎麼做?

語言: CN / TW / HK

眾所周知,前段時間開了 音視訊開發進階 知識星球,已經有不少朋友加入並且活躍起來了。

關於知識星球的介紹可以看這篇文章:

一個關於音視訊領域專業問答的小圈子!!

目前 音視訊開發進階知識星球 還在讓利中,非常低的價格就可以獲得業內一線開發人員的答疑解惑。

與其在群裡面提問石沉大海,不如來星球有問必答,而且這個價格還是管一年的哦,一年的時間可以說是相當划算了。

一些乾貨教程也正在準備中,馬上要和大家見面了!!!

想要加入的可以通過掃如下二維碼進星球哦,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. 實踐

放在最後,也是最重要的模組,就是實踐了,實踐出真知。

入門或者轉行音視訊,理論方案說再多,還是要落實到行動上,強調實踐,整起來就流弊!!!

另外,實踐也要講究環境氛圍,他人的實踐也可以成為你成長的臺階,就比如音視訊的細節很多,我也不可能什麼都搞過,但是我的同事搞過,我可以去了解他做內容,同樣增加了自己的知識面,反過來亦如此。

如果你覺得自己掌握的已經夠好,那麼不妨跳出來試試外面的世界,也許會有更好的機會在等你。

如果你在實踐中遇到的問題,也歡迎加入音視訊開發進階 知識星球,提供專業的答疑和乾貨內容。

這兩天肝完了,時間有點倉促,其實還有很多可以講的,歡迎大佬一起交流討論~~