DEV Community

ShinJustinHolly3317
ShinJustinHolly3317

Posted on

如何做串流影音 episode thumbnail

今天聽了自己一個朋友的 podcast 被啟發到,決定要開啟一個單元,分享目前在工作上遇到不錯的專案,再不透露資安的情況分享技術優點,以及我覺得可以做更好的地方。

從到職做了兩年,大大小小的功能都做了一輪,小到執行腳本修 bug,大到系統架構設計。自己最喜歡的還是剛入職第一個做的功能:episode thumbnail
這個功能我一直以為我們公司早做了,因為不論是 Netflix, Disney 其他主流串流影音都早行之有年,這才發現我們竟然沒做...公司說大不大說小也不小..
但也因為如此,我才有機會接觸這個最不像後端在做的功能,而且當時確實做的非常開心。

net

lt

Architecture

架構使用非常簡單的 lambda 搭配 aws 包辦的 message queue(SQS)。因為畢竟他只是一個 function 執行。並且每分鐘都會檢查內部的 working message queue,如果有人送工作事項進來就會來執行。
每一次產生圖片約執行 5 ~ 15 mins,看那部戲劇的內容複雜程度。
也因為會執行很久,所以使用 message queue 來非同步處理產生 thumbnail。
a1

這邊有一個比較特別的是 lambda timeout 時間上線是 15min,因為這個 lambda 涉及圖片分析,所以運算時間偏久,因此需要設定一個上限值,避免無止盡的不斷運算下去。
Message queue 使用了 FIFO queue,確保順序,因為 AWS SQS 預設是沒有 FIFO 的。另外為了避免重複的訊息送進來,使用 content-based deduplication 避免 retry 導致的重複 message。

Use Case

這部分也是琢磨很久才想出怎樣的圖片才可以代表這一集。我認為 Netflix 應該是由人工的智慧挑選XD。不然怎麼可能每一集截圖都是一張剛好很精彩的畫面?
但我們沒有這個人力,最後討論出幾個方式判斷出一張可以代表這一集的圖片。

  1. 從快轉縮圖群集中篩選出該部劇 1/4~3/4 時間的圖片們
  2. 在挑選不模糊的圖片(蠻高機率會出現模糊的圖片,很動態那種)
  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 的方式,其實有點陽春,我個人認為還有很多可以優化的地方。

  1. 我認為沒有必要使用 mq,畢竟這不是什麼量很大服務,每天就幾部劇再轉檔而已,使用 lambda trigger lambda 我覺得會更好,讓管理上更容易。
  2. 為了要遵循 DDD,我認為這邊做了許多沒有必要的封裝,其實就是個簡單的 use case 配上一些 service,當時為了要裝逼做了許多沒必要的事,現在看來真的是...
  3. Netflix 可以觀察到,一般戲劇會挑選有人臉的圖片,如果是美食實境秀,會挑選食物..可以得知 episode thumbnail 是可以根據主題挑選的,在現在 AI 成熟的年代,應該是可以借力 AI 幫忙挑選。

Top comments (0)