今天聽了自己一個朋友的 podcast 被啟發到,決定要開啟一個單元,分享目前在工作上遇到不錯的專案,再不透露資安的情況分享技術優點,以及我覺得可以做更好的地方。
從到職做了兩年,大大小小的功能都做了一輪,小到執行腳本修 bug,大到系統架構設計。自己最喜歡的還是剛入職第一個做的功能:episode thumbnail
這個功能我一直以為我們公司早做了,因為不論是 Netflix, Disney 其他主流串流影音都早行之有年,這才發現我們竟然沒做...公司說大不大說小也不小..
但也因為如此,我才有機會接觸這個最不像後端在做的功能,而且當時確實做的非常開心。
Architecture
架構使用非常簡單的 lambda 搭配 aws 包辦的 message queue(SQS)。因為畢竟他只是一個 function 執行。並且每分鐘都會檢查內部的 working message queue,如果有人送工作事項進來就會來執行。
每一次產生圖片約執行 5 ~ 15 mins,看那部戲劇的內容複雜程度。
也因為會執行很久,所以使用 message queue 來非同步處理產生 thumbnail。
這邊有一個比較特別的是 lambda timeout 時間上線是 15min,因為這個 lambda 涉及圖片分析,所以運算時間偏久,因此需要設定一個上限值,避免無止盡的不斷運算下去。
Message queue 使用了 FIFO queue,確保順序,因為 AWS SQS 預設是沒有 FIFO 的。另外為了避免重複的訊息送進來,使用 content-based deduplication 避免 retry 導致的重複 message。
Use Case
這部分也是琢磨很久才想出怎樣的圖片才可以代表這一集。我認為 Netflix 應該是由人工的智慧挑選XD。不然怎麼可能每一集截圖都是一張剛好很精彩的畫面?
但我們沒有這個人力,最後討論出幾個方式判斷出一張可以代表這一集的圖片。
- 從快轉縮圖群集中篩選出該部劇 1/4~3/4 時間的圖片們
- 在挑選不模糊的圖片(蠻高機率會出現模糊的圖片,很動態那種)
- 挑選沒有字幕的
- 裁切
以上四步驟雖然簡單,但對於剛剛轉職軟體的我來說,確實有一點小難度。好在曾經在轉職課程剛好有學到影像處理,可以理解圖片是怎麼處理跟判斷,讓專案可以在一個 sprint 順利完成。
當時花了比較多時間在處理找出 sharp 的圖片,而且要怎麼定義 sharpness value,甚至還研讀了[一堆文章],一度想嘗試自己寫 Laplacian method (https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/)
最後是剛好找到 Javascript 有個套件叫做 sharp 專門做影像處理,裡面有個 sharpness value,大量處理後,我計算出平均值以及標準差,找出 2.5 這個數字約為中間數,再由大家投票,決定訂 2.5 是肉眼可以覺得是清晰的圖片,大於 2.5 就定義為清晰圖片。
再來是挑選沒有字幕得圖片,因為台灣許多戲劇公司,他們習慣把字幕直接鑲嵌在原始影片裡面,因此導致在做戲劇截圖時,容易抓到字幕。字幕這點完全就沒有辦法了,我們這點借助了 GCP vision api,使用裡面中文判斷字幕的功能。
裁切相對簡單,研讀一下套件如何材切就好了。
我認為最後一個考驗是,我要怎麼不斷進行這個 loop。在 1/4~3/4 這個區間,為求平均,我會隨機挑選一張,並且把失敗的圖片暫存到一個 set,避免重複挑選。
但是 lambda 最大 timeout 時間是 15min,所以假如運氣不好,我一直挑到 sharpness, vision api 需要大量時間運算,是蠻有可能出現 timeout 狀況,而且這問題確實發生數次。
解決方式就是設定一個上限次數,當達到上限,還沒有找到一個完美的圖片,只好使用 fallback plan,就是至少是清晰,但是可以接受有字幕的圖片。每次計算,我會暫存上一張清晰的圖片,如果達到上限,就會使用這張暫存的圖片。
以上大概是我們處理 episode thumbnail 的方式,其實有點陽春,我個人認為還有很多可以優化的地方。
- 我認為沒有必要使用 mq,畢竟這不是什麼量很大服務,每天就幾部劇再轉檔而已,使用 lambda trigger lambda 我覺得會更好,讓管理上更容易。
- 為了要遵循 DDD,我認為這邊做了許多沒有必要的封裝,其實就是個簡單的 use case 配上一些 service,當時為了要裝逼做了許多沒必要的事,現在看來真的是...
- Netflix 可以觀察到,一般戲劇會挑選有人臉的圖片,如果是美食實境秀,會挑選食物..可以得知 episode thumbnail 是可以根據主題挑選的,在現在 AI 成熟的年代,應該是可以借力 AI 幫忙挑選。
Top comments (0)