雲函式在音視訊轉碼壓縮場景應用案例
阿新 • • 發佈:2021-01-08
技術標籤:serverless案例
背景
在社交應用,視訊應用等領域,後端系統會收到使用者上傳的大量音視訊檔案,以及各種渠道商提供的音視訊資料。這些資料的資料量大,頻率高,質量參差不起,對系統的實時處理要求比較高,也給系統帶來很大的壓力。對於前端使用者,也有自己不同的需求,比如流量不足的情況下,使用者想選擇清晰度沒那麼高的視訊。對於後端系統,為了節省頻寬,也會選擇一定程度上的降低視訊的清晰度。對於這種情況,我們可以使用雲函式對這些視訊檔案處理,對應產生不同清晰度的視訊,比如1080p,720p等,以滿足不同場景下使用者的需求,適應使用者寬頻小,流量少,網路不穩定的情況。
方案設計
整體資料流轉如圖所示:
詳細步驟:
1.在雲函式控制檯建立雲函式,程式碼如下:
/************************************************************************* ***** ***** ***** 使用教程/readme : ***** ***** https://cloud.tencent.com/document/product/583/47071 ***** ***** ***** **************************************************************************/ const COS = require('cos-nodejs-sdk-v5'); const fs = require('fs') const child_process = require('child_process') const util = require('util'); exports.main_handler = async (event, context) => { try { let downloadPath = '' let key = '' if (event.hasOwnProperty('body')) { downloadPath = event.body key = downloadPath.split('/').pop() } else if (event.hasOwnProperty('Records')) { key = event['Records'][0]['cos']['cosObject']['key'].split("/").pop() downloadPath = event['Records'][0]['cos']['cosObject']['url'] } else { return {"code": 410, "errorMsg": "event does not come from COS or APIGW"} } key = `new-${key}` const uploadPath = `/tmp/${key}` const region = process.env.region const targetBucket = process.env['target_bucket'] const targetPath = process.env['target_path'] || '' const secretId = process.env['TENCENTCLOUD_SECRETID'] const secretKey = process.env['TENCENTCLOUD_SECRETKEY'] const token = process.env['TENCENTCLOUD_SESSIONTOKEN'] const cos = new COS({ SecretId: secretId, SecretKey: secretKey, XCosSecurityToken: token }) child_process.execSync('cp ./ffmpeg /tmp/ffmpeg') child_process.execSync('chmod 755 /tmp/ffmpeg') child_process.execSync(`./ffmpeg -i ${downloadPath} -r 10 -b:a 32k ${uploadPath}`, { cwd: "/tmp" }) const putObjectAync = util.promisify(cos.putObject.bind(cos)) await putObjectAync({ Bucket: targetBucket, Region: region, Key: `${targetPath}/${key}`, Body: fs.readFileSync(uploadPath) }) fs.unlinkSync(uploadPath) return 'success' } catch (err) { console.log(err) return 'failed' } }
2.建立COS觸發器。上傳音視訊檔案後立刻觸發雲函式的處理邏輯。
3.配置掛在CFS,由於音視訊檔案一般較大,所以需要掛在額外的檔案系統。