Post
2025年11月18日 下午03:34
歡迎所有互動

關於多媒體檔案處理 pipeline 的一些事情

圖片/影片上傳是大多數服務都會需要的功能,但處理多媒體檔案的架構其實是蠻麻煩的事情。

架構一:收到檔案之後直接拿來用

如果伺服器在收到檔案之後直接拿來使用當然是最快也最輕鬆的。如果經營的是雲端硬碟那好像也沒什麼問題。但如果是要分享給他人的東西⋯⋯:

  1. 使用者上傳的檔案多半都很大:一般手機拍攝的照片大約在 2~4MB 不等,影片可以到 512MB~1GB。網路流量費用跟儲存費用都會相當可觀。
  2. 不同系統對格式的支援不同:分享圖片或影片的最大原因還是希望讓其他人看。可惜現在已經不是以前那個只有 jpeg 的時代了,A 拍攝的照片用 B 的手機不一定能看,B 拍攝的影片 A 也不一定能播。
  3. EXIF:手機拍攝的照片跟影片多半有 GPS 標記跟一些比較私人的裝置資訊。雖然 iPhone 上傳檔案時可以選擇不要包含位置資訊,但⋯⋯誰會花時間按那個。

架構二:收到檔案之後先轉檔再放行

這個是蠻多服務會選擇的方式。在使用者上傳圖片之後先轉成 jpeg/png,再放到網路上。大部分圖片都可以在幾秒以內轉檔完成,對伺服器來說不是什麼問題。

可惜影片的狀況不一樣。video encoding 的計算單位不是秒,是倍。一個 N 秒的影片需要 N 的幾倍時間才能處理完成。很明顯的,發一篇文章要等數十秒的上傳時間+數百秒的處理時間不是很理想的做法。

目前 Mosir 的架構:樂觀混合模式
  1. 上傳前可以轉檔就先轉檔
  2. 上傳完成後如果可以,稍微處理後使用(格式支援度優先,稍微大一點也沒關係)
  3. 在有空的時候再把檔案拿出來慢慢壓縮

這樣大約可以讓 80% 的檔案在極短的時間內完成上傳,並且確保所有人的裝置都可以觀看這個圖片/影片。而且,API server 也不用花費珍貴的 CPU 處理轉檔問題。

可是樂觀混合模式的問題也很明顯。使用者能夠上傳的檔案格式越多,能夠直接使用的機率就越低。可以預期這個是接下來一段時間會需要頭痛的問題。

還沒有人留言。想成為第一個嗎?
Mosir 開發筆記14 篇文章
歡迎所有互動

一點關於 AVIF 的小事

一般常見的 JPEG 除了內容的 RGB/YUV 之外還會有 ICC 作為輔助色彩描述。但在 AVIF,雖然格式本身也支援 ICC,但同時有新的 NCLX/CICP 標準。

AOMedia 的 libavif 支援寫入 ICC 或 CICP(CICP 為主),而社群的開源專案如 ravif(rav1e-based)偏好 CICP。

所以⋯⋯我猜 Best Practice 是用 lcms2 解 ICC 的 primaries 跟 transfer,重包 CICP 交給 ravif。

🫠

歡迎所有互動

講到圖片色差就剛好想到另一件事

Mosir 並沒有使用 imagemagick、libvips、ffmpeg/libav 或 handbrake。

雖然對處理過影像/影片的人來說可能會很詭異,但這幾個解決方案真的是肥到我沒有很想用,而且 dependency 也多到一個爆炸。

不選擇常用方案的後果是前前後後加起來大概有一整個人月的時候都消耗在多媒體處理上。雖然過程中也學了不少東西,但我不確定這是不是好做法。

不過相對而言的好處是,Mosir 的 media worker 是 stream-based 的,從 network source、buffer、processor、network target 可以一口氣跑完,沒有不必要的暫存檔。未來(我不確定有沒有機會)也可以支援直播或是 voice chat。

歡迎所有互動

Lightbox Refactor(圖片/影片瀏覽器重構)

這次重構前列下的目標有:

  • 解決部分使用者不習慣滑鼠點擊黑邊不能關閉 Lightbox 的不方便
  • 改善狀態切換動畫流暢度
  • 現有三層架構(Carousel、Interaction Detection、Video Control Overlay)跟泛型(Carousel<T>, T ∈ Default, Editor)過度複雜問題
  • 修好 pinch 手勢放大圖片時錯誤使用畫面中心點作為參考點的問題

實際跳下去之後才發現問題比想像中麻煩:

  • Lightbox 狀態管理太過複雜,常有兩到三層以上的 props 傳遞
  • 既有 Flex/Grid bo...
...顯示更多 (914 字)
歡迎所有互動

UI 狀態變更的動畫

Mosir 某些狀態變更的動畫是有被刻意放慢的。

例如正在儲存草稿...。儲存動作本身大約需要 0.1ms(千分之 0.1 秒),動畫被放慢到 1.5 秒。

這只是為了讓功能看起來有在動作,實際上對功能本身沒有什麼影響。