Django elastic transcoder

AWS Elastic Transcoder 流程示意圖

AWS Elastic Transcoder 流程示意圖

前幾天玩了一下 AWS 的 Elastic Transcoder, 就寫了一個給公司用的 Django app, django-elastic-transcoder , 也順便 Open Source 出來放到 github。

其實早先有自己寫一個轉 mp3 的 web service, 但是沒時間 improve, 後來就直接透過 celery worker 用 ffmpeg 轉, 但總是想要省點力氣把轉檔這件事丟出去做, 所以最後便寫了這個 app, 打算先用在新專案上。

簡單來說呢, 這個 package 提供了一個 Transcoder class, 只要檔案在 S3 上面, 便可以直接轉出檔案放回 S3, 簡單的使用方法如下:

from dj_elastictranscoder.transcoder import Transcoder

input = {  
    'Key': 'path/to/input.wav',
}

outputs = [{  
    'Key': 'path/to/output.mp3',
    'PresetId': '1351620000001-300040' # for example: 128k mp3 audio preset
}]

pipeline_id = '<pipeline_id>'

transcoder = Transcoder(pipeline_id)  
transcoder.encode(input, outputs)  

只要透過以上這段 code, 很簡單就可以轉檔完畢。

除此之外, 轉檔過程可以透過 AWS SNS 來發送轉檔狀態通知, 像是轉檔中, 轉檔失敗, 轉檔完成, 所以另外寫了 endpoint 來接收 SNS notification。

這時候因為是 Django app 其實沒辦法 customize, 所以也寫了 Django 的 Signals, 來發送 signals 出去, 讓使用這個 app 的開發人員可以很容易的自定要做的事。

舉例來說, 要轉影片好了, 有個 Video model 會需要更新轉檔狀態 (state), 就可以這樣寫, 來接收轉檔成功的 signal。

from dj_elastictranscoder.signals import transcode_complete

@receiver(transcode_oncomplete)
def encode_oncomplete(sender, job, message, **kwargs):  
    job.video.state = 'completed'
    job.video.save()

這樣便可以讓開發人員自行接收 signal, 然後定義後續要做的事情, 像是更改影片狀態, 存下轉出來的檔案路徑等等。

這次開發學習了很多啊, Django 的設計的確是挺不錯的, 其他詳細的使用說明寫在 github 上的 README 了, 有興趣的人在過去看看吧。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!