随着雲原生、直播技術的不斷發展,線上授課、重大賽事、網劇輪播等直播場景不斷豐富,很多直播平台已經在以上場景都支援了僞直播功能,本文對騰訊雲現有的各種僞直播方案進行梳理,并針對serverless+雲直播方案進行詳細介紹。
騰訊雲現有方案概覽
方案 | 底層能力 | 适用場景 | 接入複雜度 | 延遲 |
---|---|---|---|---|
點播轉碼 | 雲點播 | 通過HLS播放,限制觀看時間,限制調整觀看進度,适合對延遲及播放格式要求不高的場景 | 簡單 | 10s以上 |
雲直播拉流轉推 | 雲直播 | 使用雲直播拉流轉推能力,可将一個檔案作為拉流來源,适用于僞直播任務數量較少的場景。 | 中 | 根據播放協定不同,webtrc<rtmp<flv<HLS |
SAAS服務 | 導播台SAAS | 通過雲導播台能力,通過圖形頁面操作轉推,适用于無開發人員,開箱即用的場景 | 簡單 | 同上 |
serverless+TRTC | 雲函數+TRTC | 基于serverless+實時音視訊技術,适用于為超低延遲及互動連麥場景 | 中 | 1S > T >300ms |
serverless+雲直播 | 雲函數+快直播/标準直播 | 基于serverless+實時音視訊技術,适用于較低延遲及純觀看場景 | 簡單 | 根據播放協定不同,通常延遲webtrc<rtmp<flv<HLS |
一 點播僞直播方案介紹
僞直播依托于點播的播放控制能力,将點播檔案增加“限制觀看時間”和“同步觀看進度”兩種通路控制的功能,使點播檔案達成類直播效果,使用者可以首先生成點播檔案,在指定的直播時間使用點播檔案進行類直播分發,有效的降低直播的風險與成本
使用限制:
該方案中僞直播本質上是點播,是以并不具備标準直播的一些能力,例如:
- 不支援對“一場”僞直播進行資料統計。
- 無法感覺“一場”僞直播的開始和結束。
- 不支援對正在進行的僞直播做暫停/終止等操作。
- 不支援對已分發出去的僞直播連結進行禁用。
- 不支援動态改變視訊内容(例如實時轉碼、打水印等)。
實作步驟:
步驟1:上傳視訊到雲點播
步驟2:将視訊轉碼為 HLS
步驟3:開啟 Key 防盜鍊
步驟4:計算防盜鍊簽名
二 雲直播拉流轉推方案
騰訊雲直播控制台提供拉流轉推工具,若您直播源無推流能力或點播視訊内容需通過直播形式分發,拉流轉推服務提供内容拉取并推送的功能,無需進行直播推流,即可快速拉取已有的視訊/直播,推送到目标位址上。

注意事項
- 最多支援建立20個拉流轉推任務,如果需要提高限制需要提工單申請。
- 使用拉流轉推服務會産生拉流轉推任務時長賬單,詳細費用請參見 拉流轉推計費說明。
三 導播台SAAS
雲導播台內建輪播功能,提供豐富的直播編輯能力。
雲導播台
四 serverless+TRTC
當使用者業務場景需要支援超低延遲觀看,并且同時支援主播及觀衆連麥互動場景,serverless雲函數提供開箱即用、靈活便捷、可程式設計的線上媒體流輸入能力,支援将已有的錄播視訊或者 RTMP 直播流推送到實時音視訊 TRTC 房間進行直播
使用雲函數為 TRTC 輸入線上媒體流
五 serverless+雲直播
以上四種方案在騰訊雲官網已經有較為詳細的文檔,接下來以serverless+快直播webrtc為例,介紹雲函數+快直播實作僞直播的示例
serverless+雲直播的的方式與上文TRTC的方式類似,隻是将TRTC替換為雲直播:
實作步驟:
5.1 建立雲函數
- 登入雲函數控制台,選擇左側導航欄中的【函數服務】。
- 在“函數服務”頁面上方選擇地域,并單擊【建立】進入建立函數頁面,模糊搜尋"rtmp",選擇“視訊檔案轉RTMP模闆”進入下一步。如下圖所示:
可使用模闆函數修改業務邏輯
5.2 準備直播推流及播放位址
參考 雲直播位址生成器
注意UDP格式位址即為快直播位址
5.3 測試函數功能
1 使用 Postman 構造 HTTP 請求,傳入點播檔案位址和直播rtmp推流位址,其中檔案位址為對象存儲檔案位址,快直播和普通直播的推流位址為同一個
2 請求發送後會收到異步函數響應 “Async run task submitted”
3 在“函數詳情”頁面中選擇【日志查詢】頁簽,檢視函數執行狀态
4 使用播放器觀看快直播或标準直播位址
快直播需要用webrtc播放,參考: 騰訊雲webrtc播放器demo
webtrc player
5 在雲直播控制台流資料檢視播放統計資料
流資料查詢
6 模闆代碼示例
# -*- coding: utf8 -*-
import json
import os
import subprocess
import logging
import sys
import re
import requests
#ffmpeg指令
#視訊轉flv推流RTMP
video_2rtmp = '/tmp/ffmpeg -re -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 2 -progress /dev/stdout -ss %s -i "%s" -c copy -f flv -flvflags no_duration_filesize "%s" '
def main_handler(event, context):
# 為了适配windows端使用者
# 将ffmeg檔案複制到/tmp下并賦予執行權限
subprocess.run(
'cp ./ffmpeg /tmp/ffmpeg && chmod 755 /tmp/ffmpeg',
shell=True)
#判斷請求是否從API網關傳遞
if "body" in event.keys():
body = event['body']
data = json.loads(body)
# 視訊檔案位址,必選項
video_url = data['video_url']
print("==== video_url ====")
print(video_url)
# RTMP推流位址,需包含鑒權資訊,必選項
rtmp_url = data['rtmp_url']
print("==== rtmp_url ====")
print(rtmp_url)
# 播放起始時間點,可選參數,預設從檔案頭開始
if 'ss' in data:
ss = data['ss']
else:
ss = '00:00:00.00'
# 其他觸發器邏輯可以自行添加
else:
return {"code": 410, "errorMsg": "event does not come from APIGW"}
child = subprocess.Popen(video_2rtmp %(ss, video_url, rtmp_url), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True, shell=True)
while True:
# 實時進度資訊
line = child.stdout.readline().decode("utf-8")
print(line)
# 提取進度中時間資訊
time = re.search("time=[0-9]+:[0-5][0-9]:[0-5][0-9].[0-9]+", line)
if time:
# 時間格式 time=00:00:00.00 如需要記錄,可以将該資訊寫入持久化存儲
print(time.group())
if line.strip() == '' and child.poll() is not None:
break
return {
"isBase64Encoded": False,
"statusCode": 200,
"headers": {'Content-Type': 'text/html'},
"body": ""
}
複制
六 注意事項
以上僞直播方案僅提供内容拉取與推送服務,請確定内容已獲得授權并符合内容傳播相關的法律法規。若因版權問題或内容違規,雲直播會停止相關的功能服務并保留追究法律責任的權利。
參考文檔:
1 如何将點播視訊轉為類直播效果
2 雲直播拉流轉推
3 技術解碼 | 僞直播及拉流多平台轉推介紹
4 使用雲函數為 TRTC 輸入線上媒體流
5 雲直播位址生成器