在 《Serverless 音視頻轉碼——芒果 TV 落地實踐(上)》中,我們回顧了芒果 TV 吳堅強老師在 techo 大會的精彩分享,芒果TV 音視頻編解碼業務團隊通過使用騰訊云 Serverless 音視頻轉碼服務,成本降低 45% 以上,引起大家的廣泛關注,小伙伴們都躍躍欲試!
本文我們將帶領大家一起使用云函式 + COS + CLS + FFmpeg 構建高可用、并行處理、實時日志、高度自定義的視頻轉碼服務,我們在此提供了兩種方案,您可以直接用轉碼應用,一鍵部署,也可以通過
用函式的長運行方案來自己處理,
實作方案
方案一: 使用官網的流式音視頻轉碼,一鍵部署,查看詳情
方案二: 利用云函式的異步執行機制,自主研發,查看詳情
流式音視頻轉碼方案
通過云函式創建 FFmpeg 任務行程,云函式行程與 FFmpeg 任務行程通過 pipe 和 FIFO 的方式進行資料傳輸,云函式行程中的兩個任務執行緒分別接收 FFmpeg 任務行程向函式行程輸出的 FFmpeg 日志流與轉碼后的檔案流,從而實作流式讀寫 COS 和實時日志輸出的轉碼應用場景,
方案優勢
- 流式轉碼
采用流式拉取源視頻檔案,流式上傳轉碼檔案的作業方式,突破了本地存盤的限制,且不需要額外部署 CFS 等產品, - 實時日志
視頻轉碼程序中,可通過 CLS 日志實時查看轉碼進度,同時支持輸出 FFmpeg 應用的完整日志, - 長時運行
利用云函式的長時運行機制,支持 12h-24h 的運行時長,可覆寫大檔案耗時較長的轉碼場景, - 自定義引數
支持用戶自定義配置 FFmpeg 命令引數,
前提條件
- 安裝 Serverlesss Framework,
- 函式長時運行 白名單申請,
- 配置部署賬號權限,參考 賬號和權限配置
- 配置 運行角色 權限,
操作步驟
1. 下載轉碼應用
sls init transcode-app
進入專案目錄 transcode-app,將看到目錄結構如下:
transcode-app
|- .env #環境配置
|- serverless.yml # 應用配置
|- log/ #log 日志配置
| └── serverless.yml
└──transcode/ #轉碼函式配置
|- src/
| |- ffmpeg #轉碼 FFmpeg 工具
| └── index.py
└── serverless.yml
log/serverless.yml定義一個 CLS 日志集和主題,用于轉碼程序輸出的日志保存,目前采用騰訊云 CLS 日志存盤,每個轉碼應用將會根據配置的 CLS 日志集和主題去創建相關資源,CLS 的使用會產生計費,具體參考 CLS 計費規則,transcode/serverless.yml定義函式的基礎配置及轉碼引數配置,transcode/src/index.py轉碼功能實作,transcode/src/ffmpeg轉碼工具 FFmpeg,
2. 配置環境變數和應用引數
- 應用引數,檔案
transcode-app/serverless.yml
#應用資訊
app: transcodeApp # 您需要配置成您的應用名稱
stage: dev # 環境名稱,默認為 dev
- 環境變數,檔案
transcode-app/.env
REGION=ap-shanghai # 應用創建所在區,目前只支持上海區
TENCENT_SECRET_ID=xxxxxxxxxxxx # 您的騰訊云sercretId
TENCENT_SECRET_KEY=xxxxxxxxxxxx # 您的騰訊云sercretKey
說明:
- 您可以登錄騰訊云控制臺,可以在 API 密鑰管理 中獲取 SecretId 和 SecretKey,
- 如果您的賬號為主賬號,或者子賬號具有掃碼權限,也可以不配置 SercretId 與 SercretKey,直接掃碼部署應用,更多詳情參考 賬號和權限配置,
3. 配置轉碼需要的引數資訊
-
CLS 日志定義,檔案
transcode-app/log/serverless.yml#組件資訊 component: cls # 參考 component 的名稱 name: cls-video # 創建的實體名稱,請修改成您的實體名稱 #組件引數 inputs: name: cls-log # 您需要配置一個name,作為您的cls日志集名稱 topic: video-log # 您需要配置一個topic,作為您的cls日志主題名稱 region: ${env:REGION} # 區域,統一在環境變數中定義 period: 7 # 日志保存時間,單位天 -
云函式及轉碼配置,檔案
transcode-app/transcode/serverless.yml#組件資訊 component: scf # 參考 component 的名稱 name: transcode-video # 創建的實體名稱,請修改成您的實體名稱 #組件引數 inputs: name: transcode-video-${app}-${stage} src: ./src handler: index.main_handler role: transcodeRole # 函式執行角色,已授予cos對應桶全讀寫權限 runtime: Python3.6 memorySize: 3072 # 記憶體大小,單位MB timeout: 43200 # 函式執行超時時間, 單位秒, 即本demo目前最大支持12h運行時長 region: ${env:REGION} # 函式區域,統一在環境變數中定義 asyncRunEnable: true # 開啟長時運行,目前只支持上海區 cls: # 函式日志 logsetId: ${output:${stage}:${app}:cls-video.logsetId} # cls日志集 cls-video為cls組件的實體名稱 topicId: ${output:${stage}:${app}:cls-video.topicId} # cls日志主題 environment: variables: # 轉碼引數 REGION: ${env:REGION} # 輸出桶區域 DST_BUCKET: test-123456789 # 輸出桶名稱 DST_PATH: video/outputs/ # 輸出桶路徑 DST_FORMATS: avi # 轉碼生成格式 FFMPEG_CMD: ffmpeg -i {inputs} -y -f {dst_format} {outputs} # 轉碼基礎命令,您可自定義配置,但必須包含ffmpeg配置引數和格式化部分,否則會造成轉碼任務失敗, FFMPEG_DEBUG: 0 # 是否輸出ffmpeg日志 0為不輸出 1為輸出 TZ: Aisa/Shanghai # cls日志輸出時間的時區 events: - cos: # cos觸發器 parameters: bucket: test-123456789.cos.ap-shanghai.myqcloud.com # 輸入檔案桶 filter: prefix: video/inputs/ # 桶內路徑 events: 'cos:ObjectCreated:*' # 觸發事件 enable: true
- 輸出桶與函式建議配置在同一區域,跨區域配置應用穩定性及效率都會降低,并且會產生跨區流量費用,
- 記憶體大小上限為3072MB,運行時長上限為43200s,如需調整,請 提交工單 申請配額調整,
- 轉碼應用必須開啟函式長時運行 asyncRunEnable: true,
- 運行角色請根據 運行角色 創建并授權,
- 示例配置的 FFmpeg 指令僅適用于 AVI 轉碼場景,詳細介紹參考 FFmpeg 指令,
4. 部署專案
在 transcode-app 專案目錄下,執行 sls deploy 部署專案,
cd transcode-app && sls deploy
5. 上傳視頻檔案
上傳視頻檔案到已經配置好的cos桶指定路徑,則會自動轉碼,本示例中是cos桶test-123456789.cos.ap-shanghai.myqcloud.com下的/video/inputs/
轉碼成功后,檔案將保存在您配置的輸出桶路徑中,本示例中是cos桶test-123456789.cos.ap-shanghai.myqcloud.com下的/video/outputs/
6. 重新部署
如果需要調整轉碼配置,修改檔案 transcode/serverless.yml 后,重新部署云函式即可:
cd transcode && sls deploy
監控與日志服務
批量檔案上傳到 COS 會并行觸發轉碼執行,
- 登錄 云函式控制臺 的【函式服務】頁面中,單擊函式名進入函式管理頁面,
- 單擊【日志查詢】,即可查看日志監控,

- 單擊【函式管理】>【函式配置】,單擊日志主題的鏈接,跳轉至日志服務控制臺,

- 在日志服務控制臺的【檢索分析】頁面中,選擇日志集合日志主題,即可查看日志檢索分析 ,

借助函式異步運行能力自主研發方案
在音視頻轉碼、ETL 大體量資料處理、AI 推理等單任務重計算的場景下,函式的單實體運行時需要更多算力及更長時間的穩定運行,若函式的呼叫端長時間阻塞等待執行結果,不僅會持續占用呼叫方資源,還會對呼叫鏈路的穩定性產生較高要求,
云函式 SCF 提供了一種全新的函式運行機制,您可通過 SCF 提供的函式異步執行模式,提升執行超時時間上限和解決現有運行機制的問題,
操作步驟
- 登錄 云函式控制臺,單擊左側導航欄的【函式服務】,
- 在主界面上方選擇期望創建函式的地域,并單擊【新建】,進入函式創建流程,
- 選擇使用【空白函式】或選擇使用【函式模板】來新建函式,
- 在“函式配置”頁面,展開【高級設定】,并勾選【異步執行】,
- 單擊【完成】即可創建函式,
運行機制原理
函式啟用異步執行后,通過同步(例如 API 網關)或異步(例如 COS、CKafka、Timer 等)呼叫端進行事件呼叫,函式將以異步執行模式回應事件,
即完成事件調度后立即回傳事件的呼叫標識 RequestId,并結束呼叫操作,呼叫端無需阻塞等待,回傳 RequestId 的同時,呼叫引擎將并行下發事件到函式運行時,開啟函式邏輯執行,進入異步執行狀態后,執行日志將實時上報至日志服務,提供對異步執行事件運行情況的實時反饋,其原理如圖所示:

注意事項:
- 由于運行機制差異,暫不支持切換同步/異步執行模式,僅支持創建函式時選擇是否開啟“異步執行”功能,函式創建后該配置將鎖定,不提供修改更新操作,
- 事件呼叫成功,回傳資訊只包含 RequestId,事件執行結果需要在函式代碼邏輯中自行實作回呼特定的 API 或者發送通知訊息,
- 實時日志強依賴于日志服務,系統將默認開啟日志服務 CLS,您需要在函式高級配置中選定已有日志集及主題,
- 如果沒有日志集或日志主題,則需要新建,
- 如果不開啟日志服務 CLS,將無法獲取實時日志,
- 異步執行目前支持最長執行時長為24小時,如需更長運行時長,可 提交工單 申請,
- 如果通過函式運行角色獲取對其他云服務組件的訪問權限,角色密鑰有效期最長為12小時,需要考慮延長有效期策略或使用長期有效密鑰,
狀態追蹤原理
函式高級配置啟用狀態追蹤后,針對異步執行的事件,將開始記錄并上報事件回應的實時狀態,并提供事件狀態的統計、查詢及終止等事件管理相關服務,其原理如下圖所示:

相關介面
事件管理相關服務 API 通過云 API 的方式提供,詳情參考官網
溫馨提示
- 產生的事件狀態資料僅保留3天,將以3天為時間視窗滑動清理,如需保留全部記錄,則需要定期拉取并保存至自有存盤,
- 關閉狀態追蹤后,將停止提供異步執行事件相關記錄、統計、查詢、終止等事件管理相關服務,已產生的事件狀態資料將在3天內清空,
- 異步運行函式的事件呼叫 QPS 限制為并發數量的十分之一,超出部分將被限制,造成回應失敗,
- 由于請求 QPS 超限、賬戶欠費等原因,事件呼叫將由調度引擎直接回傳對應例外,不會生成事件狀態記錄,
One More Thing
立即體驗騰訊云 Serverless Demo,領取 Serverless 新用戶禮包 ?? serverless/start
歡迎訪問:Serverless 中文網!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256228.html
標籤:其他
