筆者2020年立的其中一個flag就是深入學習音視訊開發,本著邊學邊記錄的理念,就寫了這篇文章作為音視訊記錄專欄的開篇。
最近打算深入學習音視訊開發的相關知識,如果你有以下困惑:
- 進軍移動開發幾年,卻總是在業務與介面之間反覆,介乎沒有拿的出手的特長。
- 聽說音視訊開發薪資很高,自己蠢蠢欲動,卻不知道怎麼入門,怎麼進階。
- 整天調UI,經常因為一個畫素的問題與設計獅撕逼個你死我活,又不想脫離移動開發這個飯碗。
如果你有以上困惑,或許你可以嘗試以下音視訊方向的探索,我們一起進步。
學習音視訊的什麼內容
知乎上有大牛用兩張圖簡單概括了音視訊的主要學習方向:
在這裡我再補充一個webrtc方向,目前幾乎所有的音視訊通話都是採用的webrtc,相信5G時代的到來webrtc將迎來更大的爆發。
這裡只是簡單列舉幾個例子作為拋磚引玉:
- 採集:是音訊和視訊同時採集呢還是分開採集呢?採集後又怎麼打包呢?
- 渲染:音視訊同步,如何高效渲染又不會導致CPU和記憶體暴增等。
- 處理:比如音混音、降噪、美顏效果、抖音靈魂出竅效果等等。
- 傳輸:比如說弱網怎麼保證傳輸、怎麼實現秒開、怎麼做到低延時等等。
我要準備那些基礎知識
- 音視訊的基本知識,起碼要懂,不然人家PCM,H264你都不知道人家在說什麼。
- C/C++的基本知識,比如指標這個是必須要會的,不然你可能連別人的程式碼都看不懂,但這個不必精通,可以與音視訊學習同步進行。
- JNI/NDK的基本知識,比如崩潰定位,Cmake語法等。
- OpenGL這個主要是在視訊渲染或對視訊進行逐幀加工處理會用到,初中級暫時可以忽略。
先就這麼多吧,我怕再寫多直接把你們勸退了,其實還有shell指令碼之類的我都不好意思說了。
學習路徑
這裡主要以Android開發為例。
- 初級
主要是Java層面的一些API呼叫。
比如使用AudioRecord進行錄音得到PCM,使用AudioTrack播放PCM音訊、使用Camera2採集攝像頭資料。
使用 MediaExtractor 和 MediaMuxer API 解析和封裝 mp4 檔案。
使用MediaCodec進行硬體編解碼等。
- 中級進階
中級主要是一些音視訊開源庫的編譯和使用,這裡就需要NDK的相關知識了:
比如FFmpeg交叉編譯,使用FFmpeg進行軟體編解碼、FFmpeg整合xh264,FFmpeg整合Rtmp推流等。
- 高階
深入研究音視訊相關的網路協議,如 rtmp,hls,以及封包格式,如:flv,mp4。
深入學習一些音視訊領域的開源專案,如 webrtc,ffmpeg,ijkplayer,librtmp 等等。
嘗試造一個ijkplayer的輪子等。
嘗試使用OpenGL模仿各種抖音效果等等。
音視訊學習形式
-
學習方式這種事情因人而異,有的人喜歡看書,有的人喜歡看部落格,而對於筆者來說就是看視訊是最快的進步方式。
-
我很信奉一句話叫做讀萬卷書不如行萬里路,行萬里路不如仙人指路。所以能找到一個這方面的牛人或者領導帶的話是最好的,但這可遇不可求。
-
根據smart目標管理原則制定你的學歷計劃,一旦定下來之後,嚴格執行。不要說今天指定了計劃,矇頭大睡一晚上,第二天起來什麼行動也沒用繼續埋怨社會的不公,明日復明天最可悲。
-
帶著問題帶著筆記去Google。學習就要有記錄,有自己的理解,最好的驗證方式是學完一個知識點,能不能自己嘗試這寫一編通俗易懂的部落格。最忌諱的就是開啟Google搜尋到問題,覺得這篇部落格不錯,右鍵新增到收藏夾,那篇部落格也不錯,右鍵新增到收藏夾,或者文章都沒看完,看到一半迅速拉到底自欺欺人說我會了。其結果就是自己什麼也沒用學到還浪費了時間。
-
先會用再講擴充和深究原理。熟練使用之後要嘗試造輪子,雖然說不要重複發明輪子,但是嘗試做自己的輪子確實是一個進步的最好的實踐。或者說我針對目前這個庫或者這個框架存在的問題,我自己寫一個能不能有更加優異的表現。
-
舉一反三。學技術就是要有追求,熟練使用之後就要想人家為什麼要這麼寫,我那樣子寫行不行?我能還有其他的方式也可以實現這樣的功能,為什麼作者沒用採用?
羅馬不是一日建成的,如果能速成,音視訊開發的崗位薪資也不會那麼高,高有高的難度,難度就是價值所在。 指定計劃一定要追求踏實,不要追求速成。俗話說飯要一口一口吃,路要一步一步走,走得太快小心扯蛋!!!
寄語
音視訊其實很多都是跨平臺的東西,和平臺繫結的東西不多。基本可以做到一里通百里明。 音視訊是個水很深的領域,很難做到全部精通,但這個領域有個好處,就是知識更新速度比較慢,學的東西不容易被淘汰,經驗的積累將會撬動你更大未來可能的一個支點。
所有的偉大都來源於一個勇敢的開始,定了目標就衝吧。
最後如果你對音視訊開發感興趣可掃碼關注,後續我們共同探討,共同進步。