随着云原生、直播技术的不断发展,线上授课、重大赛事、网剧轮播等直播场景不断丰富,很多直播平台已经在以上场景都支持了伪直播功能,本文对腾讯云现有的各种伪直播方案进行梳理,并针对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 准备直播推流及播放地址
参考 云直播地址生成器
5.3 测试函数功能
1 使用 Postman 构造 HTTP 请求,传入点播文件地址和直播rtmp推流地址,其中文件地址为对象存储文件地址,快直播和普通直播的推流地址为同一个
2 请求发送后会收到异步函数响应 “Async run task submitted”
3 在“函数详情”页面中选择【日志查询】页签,查看函数执行状态
4 使用播放器观看快直播或标准直播地址
快直播需要用webrtc播放,参考: 腾讯云webrtc播放器demo
5 在云直播控制台流数据查看播放统计数据
6 模板代码示例
代码语言:javascript复制# -*- 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 云直播地址生成器