Android開發(fā)想轉(zhuǎn)行音視頻,應該要怎么做?

在星球經(jīng)常被問到的問題,Android開發(fā)想轉(zhuǎn)行音視頻,應該要怎么做?

很多人對此都有疑惑,不光有工作多年的職場老司機,也有求學期間的研究生同學們,摘錄了其中一部分提問,可以看到大家的疑惑是有類似的。

對于星球用戶的每個提問我都有認真回答,畢竟每個人的情況不一樣,沒有什么統(tǒng)一的答案。

這些提問其實可以歸為兩類:

  1. 針對自己的情況,現(xiàn)階段要從事音視頻開發(fā)嗎?這是一個關于利弊分析的問題,也是特別實際,很現(xiàn)實的問題。

  2. 已經(jīng)決定從事音視頻開發(fā),要怎么去做呢?這是一個學習路線的問題,也是我個人的經(jīng)驗可以給到幫助的問題。

其實,第一類問題要不要從事音視頻開發(fā) 會比 第二類問題從事音視頻開發(fā)要怎么做 更難回答一些,畢竟邁出第一步永遠是最難的。

要不要從事音視頻開發(fā)

尤其是針對已經(jīng)工作多年的朋友來說,這是一個職業(yè)規(guī)劃的問題,每個人的職業(yè)經(jīng)歷、思考角度甚至利益關系都不一樣,在十字路口上選擇的方向也是不同的。

不同于技術問題的回答,聞道有先后,術業(yè)有專攻,在我不熟悉的領域回答錯了問題,并不是一件丟人的事情,反而是個學習的機會。

但職場上給錯了建議,并且聽從執(zhí)行了,那在短暫的程序員生涯上可能會造成不可逆的影響,尤其是我本身還從事音視頻的開發(fā),在一些觀念上就會有一些偏袒,很難做到客觀中立。

所以針對第一類問題,我只能從行業(yè)趨勢和自己的觀察上給出一些看法。

這一兩年因為該死的疫情,讓短視頻、超高清視頻和實時音視頻反而成為需求風口。

我的看法當然是覺得音視頻這個行業(yè)還可以,而且從我自己的觀察來看,做音視頻的現(xiàn)在普遍年齡都在 30+ 了,我 94 年的在組里有可能還是年齡最小的那一批人了。

做客戶端上的音視頻、服務端上的、嵌入式的、系統(tǒng)底層的都是音視頻的范圍,另外從事音視頻編解碼算法、網(wǎng)絡通信協(xié)議、視頻超分、音頻降噪等等,也是音視頻的領域范圍內(nèi),所以說音視頻也可以是一個很大的范圍體系,每個人處在其中的位置不同而已。

如果你很熟練 FFmpeg ,熟悉播放器,或者很懂 OpenGL 渲染,那么不懂 JVM ,不懂 Android Framework 一點也不妨礙你找高薪工作。

以上就是關于 第一類問題要不要從事音視頻開發(fā) 的建議,每個人都不同,具體情況還是要具體分析的,僅供參考。

如果你決定邁出第一步,嘗試一下入門或者轉(zhuǎn)行音視頻,那么可以接下往下看了。

從事音視頻開發(fā)要怎么做

對于 第二類問題從事音視頻開發(fā)要怎么做 大概會從四個方面給出路線:

  1. 概念

  2. 技能

  3. 架構

  4. 實踐

概念

首先,最重要的就是概念了。

既然認為音視頻也是一個單獨的領域,那么每個領域就會有它對應的名詞概念。學音視頻也和我們上學學習一樣,一門學科一開始肯定要學一些新的名詞概念。

關于音視頻常見的概念有哪些呢?幀率、碼率、I 幀、B 幀、P 幀嗎?

那么問題來了,這些概念你是從哪里得知的?尤其是 I 幀、B 幀、P 幀這種常見的面試八股文會提到的。

想必很多人我和一樣,都是從網(wǎng)絡上一些博客中得知的。但網(wǎng)絡博客質(zhì)量參差不齊,且不說一篇文章會被反復抄襲無數(shù)遍,就文章中內(nèi)容可能都不是對的,而有的同學卻沒有經(jīng)過的自己思考,盲目的吸收這些概念,等到后期遇到疑難雜癥要解決時,卻發(fā)現(xiàn)連一些基礎概念都沒搞懂。

這也是目前學習音視頻中比較蛋疼的地方,缺少統(tǒng)一的教材能夠把一些概念講清楚,尤其是涉及深一點的概念,牽扯的內(nèi)容很多,不是一兩頁就能講清楚的。

后續(xù)如果遇到好的資料,也會在知識星球內(nèi)分享給大家。

這里我舉個例子,前端面試中會有個典型的題目:從輸入 URL 到頁面展示到底發(fā)生了什么?

換到音視頻行業(yè)中,從相機錄制到編碼成視頻會發(fā)生什么,牽扯到哪些概念?

就這么一個問題都會涉及到很多操作和概念了,而從移動端轉(zhuǎn)向音視頻開發(fā)的同學可能就缺少系統(tǒng)的了解,只有碎片化的學習。

就相機操作來說,常見的相機光圈、ISO 參數(shù)、測光模式、對焦模式、焦距、曝光補償?shù)雀拍睢?/p>

就相機數(shù)據(jù)來說,YUV 格式,NV12、YUV420 等,另外還涉及到色域空間 BT.601、BT.709 等,再深入還能涉及相機的 Gamma 曲線,還有 HDR 視頻的 HLG、PQ 曲線,Tone Mapping 概念等。

就視頻編碼來說,涉及到 H.264 算法,常見概念有 IDR 幀、I 幀、B 幀、P 幀等,另外還有開放 GOP 和閉合 GOP 、靜態(tài)碼率和動態(tài)碼率、AVCC 和 Annex-b 碼流格式等。

就音頻編碼來說,涉及到 ACC 算法,常見概念有采樣率、采樣位數(shù)、聲道數(shù)、比特率等,深入一點的話,還有 ACC 的 ADTS 以及 ADIF 文件格式信息等。

最后封裝成的 MP4 視頻,涉及到封裝格式,MP4 的各種 BOX 概念,常見的有 ftyp、moov、ctts 等,另外如何用工具去排查格式問題。

以上概念算是很常見了,面試八股文中會問到,死記硬背當然簡單,但要實際去理解這些概念,在代碼中調(diào)試他們,真真切切地感受這些概念的差異。

另外,這些涉及到圖像、視頻、音頻等基礎概念,不要覺得是 IT 人員搞音視頻才會有的,還沒有音視頻技術之前人類就已經(jīng)研究過很多年了。

就好比色域空間這個概念,在藝術領域同樣要用到,設計師們也要了解 sRGB 色域、P3 色域等知識。再比如采樣率這個概念,著名的奈奎斯特采樣定理早在上個世紀20年代就提出了,而第一臺計算機二十年后才誕生。理論先行,思想指導行動這個道理肯定沒錯的。

音視頻也可以認為是一門雜學科目,確實各個方面都會涉及到,這也是為什么要強調(diào)概念很重要,基礎不牢,地動山搖。

當然了,一開始也不可能掌握好所有的概念,但隨著深入的學習就會愈發(fā)覺得把一些基礎概念弄清楚有多重要。

2. 技能

掌握音視頻概念之后,接下來就是技能了,也是很多人關心的音視頻開發(fā)要如何學習的部分。

為什么要把這部分稱作技能呢?在網(wǎng)上其實也有很多音視頻入門指南了,有的指南還很全面,每篇文章都會講解技術點,講述 API 具體如何使用等。

舉個例子:

  1. 使用 MediaExtractor 和 MediaMuxer 來解封裝和封裝 mp4 文件

  2. 使用 MediaCodec 來編碼和解碼 H.264 和 AAC 數(shù)據(jù)

  3. 使用 Camera API 完成相機的預覽、對焦操作

  4. 使用 FFmpeg 做視頻的解封裝和封裝

  5. 使用 FFmpeg、libx264、libfdk-aac 等各種庫完成音視頻的編解碼操作等

  6. .....

以前的我也認為把上面內(nèi)容都掌握了,就算是學懂音視頻了,現(xiàn)在才覺得他們就是一些技能而已,是學習音視頻的必要不充分條件。

音視頻相關的技能操作肯定是必須要掌握的,但如果只沉醉于各種技能的學習,那么我可以很認真地告訴你,你只會是一個工具人而已。

不要為了學習技能而學習技能,舉個例子,安卓上想要實現(xiàn)音頻的播放有哪些方式呢?

系統(tǒng)提供的 API 就有 MediaPlayer 、AudioTrack 直接播放音頻,底層一點還可以用 OpenSL 播放音頻。

另外還可以使用第三方庫 FFmpeg、libfdk-aac 等來做解碼操作配合上層接口播放音頻。

想要實現(xiàn)同樣的功能,可以有多種不同的方案設計。那么多排列組合都去掌握的話,當然學不過來了。

不是說掌握技能不重要,而是說要換一種思路去學習。

技術方案排列組合有很多,但最終的業(yè)務形態(tài)是有限的呀,比如播放器、直播推拉流、音視頻通話、短視頻錄制和編輯等,而且這些業(yè)務形態(tài)有一些技能還是通用的。

在學習音視頻時,就要先設定某種業(yè)務形態(tài),圍繞這個業(yè)務去掌握一系列技能,并選擇最優(yōu)的解決方式。

比如想做播放器,那么先掌握用 MediaExtractor 去解封裝、用 MediaCodec 解碼、用 OpenGL 渲染等,然后再用 FFmpeg 去解封裝和解碼,這個時候完成了第一版基礎技能掌握,然后再用不同的實現(xiàn)方案替換中間的某個環(huán)節(jié),對比新舊方案的效率怎么樣,哪個更優(yōu)?

更好的方案當然要優(yōu)先使用,為什么大廠的音視頻體驗那么好,因為他們早在各種方案中選擇了最優(yōu)的。

通過這樣的方式學習技能,才不會因為一些新的技術出現(xiàn)來疲于奔命。

3. 架構

假如此時,你已經(jīng)熟練使用各種音視頻技能,并且對每個方案的實現(xiàn)優(yōu)劣都很清楚,能選擇最好的方案,那么恭喜你已經(jīng)是一個優(yōu)秀的工具人了。

為什么還要強調(diào)工具人呢,因為工具人只會實現(xiàn)功能,缺少了一些架構思想,而這正是進階轉(zhuǎn)變的關鍵之處。

同事之間經(jīng)常說自己是做音視頻工程的,一些特效、算法都是其他組做的,我們做的工程要很靈活的去對接和業(yè)務拓展,像剪映的編輯模塊有很多功能,畫中畫、曲線變速、蒙版、定格、動畫等,既有涉及編解碼的,也有涉及效果,如果架構設計一開始沒弄好的話,后面業(yè)務迅速發(fā)展,技術側(cè)就很難保證迭代速度可以跟上業(yè)務腳步了。

這個時候光掌握一些技能就不夠看了,要學會打地基,學會設計架構,從一個小的模塊開始再到整體的模塊。

當然架構設計也不是空中閣樓,不可能脫離業(yè)務存在的,想要做好架構設計,首先還是要理解好自己的業(yè)務,針對目前在業(yè)務上的弊端做優(yōu)化,同時也多觀察競品的功能,假如現(xiàn)在的設計要實現(xiàn)競品的功能,又會遇到哪些問題呢?另外,針對問題要能看到問題的本質(zhì),抽象出自己的理解。

除此之外,多看一些優(yōu)秀的開源項目也是大有裨益的,就比如 FFmpeg 的源碼和結(jié)構設計,還有 GStreamer 和 WebRTC 的源碼及架構設計,這些優(yōu)秀的開源庫都是經(jīng)受過項目考驗的,仿照著學習就已經(jīng)能夠提高很多了。

另外,關于架構設計,目前業(yè)內(nèi)經(jīng)常會有交流活動,一些大廠也會在活動會議上把自己的架構方案與遇到的問題拿出來和大家分享,雖說具體的技術實現(xiàn)細節(jié)很少有人講,但大的方案和趨勢還是可以借鑒參考的。

后續(xù)有一些好的架構設計,也會在 音視頻開發(fā)進階 知識星球內(nèi)分享給大家!

4. 實踐

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

入門或者轉(zhuǎn)行音視頻,理論方案說再多,還是要落實到行動上,強調(diào)實踐,整起來就流弊!??!

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

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

第一章 WebRTC Native 源碼導讀

  • 第一節(jié)-安卓相機采集實現(xiàn)分析
  • 第二節(jié)-安卓預覽實現(xiàn)分析
  • 第三節(jié)-安卓視頻硬編碼實現(xiàn)分析
  • 第四節(jié)-VideoCRE 與內(nèi)存抖動優(yōu)化
  • 第五節(jié)-安卓 P2P 連接過程和 DataChannel 使用
  • 第六節(jié)-視頻數(shù)據(jù) native 層之旅
  • 第七節(jié)-混音
  • 第八節(jié)-P2P 連接過程完全解析
  • 第九節(jié)-API 概覽
  • 第十節(jié)-RTP H.264 封包與解包

第二章 X264源碼解讀

  • 第一節(jié)-概述
  • 第二節(jié)-x264命令行工具
  • 第三節(jié)-編碼器主干部分-2
  • 第四節(jié)-x264_slice_write()
  • 第五節(jié)-濾波(Filter)部分
  • 第六節(jié)-宏塊分析(Analysis)部分-幀內(nèi)宏塊(Intra)

第三章 FFmpeg

  • 第一節(jié)-FFmpeg 編譯和集成
  • 第二節(jié)-FFmpeg + ANativeWindow 實現(xiàn)視頻解碼播放
  • 第三節(jié)-FFmpeg + OpenSLES 實現(xiàn)音頻解碼播放
  • 第四節(jié)-FFmpeg + OpenGLES 實現(xiàn)音頻可視化播放
  • 第五節(jié)-FFmpeg + OpenGLES 實現(xiàn)視頻解碼播放和視頻濾鏡
  • 第六節(jié)-FFmpeg 播放器實現(xiàn)音視頻同步的三種方式
  • 第七節(jié)-FFmpeg + OpenGLES 實現(xiàn) 3D 全景播放器
  • 第八節(jié)-FFmpeg 播放器視頻渲染優(yōu)化
  • 第九節(jié)-FFmpeg、x264以及fdk-aac 編譯整合
  • 第十節(jié)-FFmpeg 視頻錄制 - 視頻添加濾鏡和編碼
  • 第十一節(jié)-FFmpeg + Android AudioRecorder 音頻錄制編碼
  • 第十二節(jié)-Android FFmpeg 實現(xiàn)帶濾鏡的微信小視頻錄制功能

第四章 ijkplayer 源碼分析系列

  • 第一節(jié)-整體結(jié)構總結(jié)
  • 第二節(jié)-read_thread流程
  • 第三節(jié)-解碼流程
  • 第四節(jié)-渲染流程

第五章 jsmpeg 源碼解析

  • 第一節(jié)-基礎知識 字符處理 ArrayBuffer TypedArray
  • 第二節(jié)-TS碼流 PAT PMT
  • 第三節(jié)-源碼buffer.js對Uint8Array的封裝
  • 第四節(jié)-源碼ts.js TS格式解析流程
  • 第五節(jié)-源碼mpeg1.js MPEG1碼流結(jié)構
  • 第六節(jié)-概要總結(jié)

第六章 Live555源碼解析

  • 第一節(jié)-GROUPSOCK
  • 第二節(jié)-MEDIUM媒體基礎類
  • 第三節(jié)-MEDIASOURCE、MEDIASINK、MEDIASESSION、MEDIASUBSESSION
  • 第四節(jié)-FRAMEDSOURCE、RTPSOURCE、RTPSINK
  • 第五節(jié)-GENERICMEDIASERVER、RTSPSERVER、RTSPCLIENT
  • 第六節(jié)-testRTSPClient
  • 第七節(jié)-ServerMediaSession、ServerMediaSubsession、live555MediaServer

第七章 Opus源碼解析

  • 第一節(jié)-簡介
  • 第二節(jié)-編解碼器使用
  • 第三節(jié)-手擼一個Opus編碼程序
  • 第四節(jié)-Opus解碼程序?qū)崿F(xiàn)
  • 第五節(jié)-OggOpus封裝器全解析
  • 第六節(jié)-Opus編碼基礎之認識聲音
  • 第七節(jié)-Opus編碼基礎之壓縮編碼

更多音視頻相關內(nèi)容可以查看我的個人介紹?。?!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容