1. 程式人生 > 其它 >雲函式在音視訊轉碼壓縮場景應用案例

雲函式在音視訊轉碼壓縮場景應用案例

技術標籤: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,由於音視訊檔案一般較大,所以需要掛在額外的檔案系統。