周六晚上,你熬完了又一個加班的周末,拖著疲憊的身體癱倒在沙發上,百無聊賴地刷著抖音。
刷累了短視頻,你又打開視頻平臺,追起那部收藏已久卻一直沒時間看的電視劇。
臨睡前,你戴上耳機,和遠方的朋友打了一通視頻電話,聊聊最近的工作和生活。
這些平凡的生活場景看起來毫無關聯,但是如果把這些產品背后的技術扒開,你就會發現,每一個笑點視頻,每一幀畫面,在進入你手機之前,都曾在某個服務器深處,被同一套工具悄悄地“重塑過”:
編碼、壓縮、裁剪、轉碼……
而那條最關鍵的指令,往往只是:
ffmpeg -i ...這就是FFmpeg,現在互聯網最龐大的“隱形巨人”。
0 1
諸侯割據的時代
讓我們把時鐘撥回到20多年前。
當時互聯網正從“文字時代”邁向“音視頻時代”,寬帶開始普及,人們瘋狂下載歌曲、MV和電影。
為了爭奪未來的網絡媒體入口,各大廠商紛紛推出自己的媒體格式和播放器生態:
![]()
微軟推出 ASF/WMV,希望借助 Windows 的優勢推廣 Windows Media Player;
RealNetworks 的 RM/RMVB 一度成為網絡視頻事實標準,RealPlayer 幾乎是裝機必備軟件;
蘋果則主推 MOV 格式和 QuickTime 生態,在 Mac 和多媒體創作領域影響巨大。
各種“方言”導致了一個悲慘的結果:視頻/編碼高度碎片化,互不兼容,解碼器幾乎全是閉源、商業化的。
更糟糕的是,很多視頻格式在壓縮時,深度依賴 Windows 系統的底層組件(如 DirectShow 或 VFW DLLs),這些組件是微軟操作系統的核心秘密,Linux 上根本沒有,巨頭公司根本不屑于為市場份額極小的 Linux 系統開發官方播放器。
不過,這難不倒聰明的 Linux 黑客。
他們想出了一個非常奇葩和極端的黑客辦法:“借尸還魂”。
他們編寫了一些特殊的底層補丁(著名的如早期 MPlayer 的 w32codec),在 Linux 中模擬部分 Windows 多媒體接口,強行加載 Windows 系統的 .dll 動態鏈接庫文件。
這種做法雖然勉強能用,但是極不穩定,極不安全,在法律上也是非常危險的灰色地帶。
正是在這種“天下大亂、生態真空”的時刻,天才程序員Fabrice Bellard站了出來:
![]()
是時候搞一套屬于開源世界的,不依賴任何Windows技術的“多媒體底層普通話”了!
這個“普通話”就叫做FFmpeg,主要完成兩個事情:
1.完成一個精妙的頂層設計,把容器和編碼徹底分開。
2.用純 C 語言,把市面上那些閉源的、復雜的商業視頻和音頻解碼算法,全部“逆向工程”并重新純手寫一遍!
這兩件事兒有多瘋狂呢,我們一個一個來看。
0 2
精妙的頂層設計
在多媒體領域,任何一個視頻文件其實都由兩部分組成,它們的職責完全不同。
![]()
容器的職責是“打包”。負責把音頻流、視頻流、字幕、甚至封面圖片以某種特定的數據結構“捆綁”在一起,我們通常通過文件的后綴來區分(video.mp4, movie.avi)。
編碼的職責是“壓縮”,視頻用H.264或MPEG-2壓縮,音頻用MP3或AAC壓縮。
現在我們很容易想到,在實現軟件播放器的時候,應該把這兩層分開,讓他們獨立變化。
但在當時的商業多媒體領域,性能壓力和商業策略,讓大量播放器與 SDK 選擇了強耦合設計,把容器和編碼綁死在了一起。
作為一個純粹的學院派加硬核極客,Fabrice Bellard可不管你這那的,這兩者一定得分開:
1.libavformat
專注于容器的解包和打包,當它讀取一個 video.mkv 時,唯一的任務就是拆開它,把一小段一小段的、依然處于壓縮狀態的二進制原始數據( AVPacket)源源不斷地吐出來。
2.libavcodec
專注于解壓和壓縮,它是一個純粹的數學計算黑盒子,它只接受 libavformat 丟給它的壓縮數據(AVPacket),通過各種算法,把它們還原成一幀一幀沒有經過壓縮的數據( AVFrame)。
不但如此,Fabrice Bellard用天才的手法,用最接近硬件的手段(手寫 SIMD 匯編、查表法、緩存對齊)把計算性能壓榨到物理極限,甚至很多時候,FFmpeg 比官方 SDK 還快。
但FFmpeg更偉大的地方,不僅僅是“支持很多格式”,它把整個音視頻世界抽象成了一套統一的數據流管道(就像Unix的數據流管道一樣)
以我們最常見的“視頻轉碼”(比如把一個高碼率的 AVI 視頻轉成手機能播放的 MP4 視頻)為例,在 FFmpeg 的管道里,數據是這樣像水流一樣流淌的:
![]()
無論任何格式,解碼,濾鏡,轉碼,都能在流水線任意組合,非常優雅和漂亮,展示了Fabrice Bellard深厚的架構功力。
0 3
瘋狂的逆向工程
前面說過,黑客們拿不到源代碼。他們只能通過反匯編工具,將機器碼翻譯成人能勉強看懂的匯編代碼:
![]()
然后用動態調試等技術來進行分析,例如讓 Windows 官方播放器慢動作播放一個視頻,黑客在后臺死死盯著 CPU 的寄存器和內存變化。
視頻壓縮本質上是高等數學通過觀察匯編指令中的常數和循環結構,黑客們能夠反向推導:“哦!原來 RealMedia 的音頻格式用的是改進的離散余弦變換(MDCT),這里的參數是這樣設置的。”
他們還會制作一些極其特殊的測試視頻文件:
一個純黑、只有 1 像素、長達 1 秒的視頻
一個純白、有 2 像素、長達 2 秒的視頻
然后用十六進制編輯器對比這兩個文件的二進制數據。
“看,第一秒和第二秒的文件里,第 0x40 字節的數據從 01 變成了 02。這意味著這個位置存放的是視頻時長!”
“這里有一串固定的字符 mdat,后面跟著一串數據。這說明 mdat 后面就是真正的音視頻原始數據(Media Data)了!”
當然,很多所謂的“閉源商業格式”,其實是基于行業公開標準魔改出來的。
對于 Fabrice Bellard 這樣的頂級專家,他不需要從零去猜,他只需要把公開標準作為模版去比對:“讓我看看微軟在這里到底改了哪幾個參數?” 一旦找出這些變動,逆向工程就容易多了。
正是用這種辦法,Fabrice Bellard 和無數逆向工程師一點點拆開了巨頭們筑起的技術圍墻。
那些原本被鎖在閉源播放器里的格式規范、編碼算法和數據結構,被重新理解、重新實現,最終變成了干凈、免費、向全世界公開的 C 語言代碼。
0 4
貧窮的維護者
Fabrice Bellard是一個極度內斂、低調,甚至有些社恐的程序員。
但有人的地方就有江湖。只要開源軟件社區規模擴大,勢必出現各種紛爭。
所以我們經常看到這樣一個模式:Bellard把一個大廈的基座和主體完成后,就立刻放手,去挑戰另一個領域。
揮一揮衣袖,不帶走一片云彩。
這次也不例外。
FFmpeg走上正軌后,他把維護權交給了 Michael Niedermayer,自己轉身投入了另一個改變世界的基礎設施項目:QEMU(虛擬機模擬器)。
Michael這個人,比Bellard還要低調,甚至可以說神秘。
他幾乎不參加技術會議或線下聚會,所有交流都通過郵件列表。我在網上甚至找不到他的照片。
他本來是MPlayer播放器的開發者,但MPlayer底層高度依賴FFmpeg的解碼能力,他的核心代碼開始大量并入FFmpeg。
接管FFmpeg之后,他做出了一個讓世俗社會無法理解的決定:全職守護FFmpeg。
要知道,當時視頻網站已經興起,他但凡接受任何一家硅谷大廠的offer,或者開一家顧問公司,就能輕松獲得巨額年薪,但他都拒絕了。
共事多年的核心開發者Kostya(Konstantin Shishkov)曾回憶證實:Michael長期住在奧地利的鄉下,過著維持“最低收入”的生活。
他幾乎沒有任何商業贊助,全靠微薄的零星捐款和極低的個人開銷度日。
Michael甚至認為,出去接私活或者為了生計去上班,是對優化編解碼器的時間浪費。
他每天工作十幾個小時,一個人完成了FFmpeg中極其龐大且晦澀的匯編級優化。
他是個瘋狂的Bug修復機——安全團隊提交的上千個Bug中,有超過650個是他一個人修復的。
他長期保持著日均1次核心Commit的高強度全職工作狀態。
0 5
技術政變:一個人對抗全世界
但是,技術天才Michael的管理風格也有問題。
他過于強硬且保守,極其注重向下兼容和極致性能,經常在核心代碼中加入各種特例。很多年輕開發者認為,他的代碼風格太“不現代”、太難維護。
社區開始積怨。
終于在2011年,一批核心開發者對 Michael 忍無可忍,他們發動了一場技術“政變”,反對派在未經Michael同意的情況下,帶走了原項目的服務器、缺陷追蹤系統等基礎設施,另立門戶創建了一個叫做 Libav 的新分支項目。
幸運的是,Fabrice Bellard 依然控制著ffmpeg.org 的 DNS,并且拒絕交給“叛軍”,FFmpeg的品牌可以保全,這一點非常關鍵。
重量級的Linux發行版(Debian、Ubuntu 等)站在了反對派一邊,將系統默認的多媒體庫換成了 Libav,FFmpeg 在 Linux 生態中的主導地位受到巨大沖擊。
面對“背叛”,Michael沒有去打口水仗,他的反擊非常純粹:瘋狂寫代碼。
他不僅瘋狂地優化FFmpeg的代碼,更是緊盯libav,只要一出新功能,他幾天內就能合并進FFmpeg,并且利用恐怖的優化能力寫得更好!而libav那邊處于政治原因,絕不合并FFmpeg的代碼。
Libav 陣營為了追求所謂的“現代化重構和干凈的 API”,導致開發速度極其緩慢;而FFmpeg 在 Michael 的死守下,“把事情做完”的效率高得驚人。
幾年下來,程序員們震驚地發現,FFmpeg 不僅完全兼容 Libav 的特性,而且由于 Michael 的瘋狂輸出,FFmpeg 的性能更強、支持的格式更多、Bug 修復得更快。
2015年,Debian決定將系統默認的多媒體庫 從Libav重新切換回FFmpeg。隨后,Ubuntu等所有主流發行版也紛紛跟進。這成為了壓垮Libav的最后一根稻草。
2015 年 8 月,在帶領 FFmpeg 徹底贏回主流生態、并將 Libav 的分裂風波平息之后,身心俱疲的Michael決定辭職,他說:
我加入 FFmpeg 已經 14 年了,擔任 Leader 也已經 11 年。我感覺我并不是最適合繼續擔任 Leader 職位的人..... 我希望我的辭職能夠讓兩個團隊重新找回彼此、走到一起,從而避免更徹底的分裂...... 合并工作(Merges)所帶來的巨大工作量和精神壓力,是我辭職的核心原因...... FFmpeg 是你們的,它是屬于每一個人的。
0 6
結語
20多年過去了,FFmpeg早已成為互聯網隱形的基礎設施。
YouTube、Netflix、Chrome、抖音,快手,視頻號,甚至你手機上的任何視頻應用,每天都在使用FFmpeg,它是數字世界的空氣,你意識不到它,但是它無處不在。
但諷刺的是,開發FFmpeg的那幫極客們,長期缺錢,幾乎沒有名氣,“近乎燃燒生命”,Michael Niedermayer 就是其中最典型的代表。
很多人不理解,他們能一直堅持下來,圖的是啥呢?
我想主要有三層驅動力:
1.興趣
這些極客們在做自己喜歡的事情,熱愛是無與倫比的驅動力。
2.成長
FFmpeg需要非常硬核的開發者,在這里,有最厲害的兩類人,1.寫匯編的 2.做逆向工程的。
想在這里做貢獻,你得理解CPU架構、內存層級、IO機制這些底層的東西,你的代碼會被最資深的程序員逐行審查,在這種環境下成長起來的開發者,往往會變得極其強悍。
3.成就感
你的代碼在幾十億的設備上運行,被幾十億用戶使用,這種成就感是無與倫比的。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.