随着云原生、直播技术的不断发展,线上授课、重大赛事、网剧轮播等直播场景不断丰富,很多直播平台已经在以上场景都支持了伪直播功能,本文对腾讯云现有的各种伪直播方案进行梳理,并针对serverless+云直播方案进行详细介绍。
方案 | 底层能力 | 适用场景 | 接入复杂度 | 延迟 |
---|---|---|---|---|
点播转码 | 云点播 | 通过HLS播放,限制观看时间,限制调整观看进度,适合对延迟及播放格式要求不高的场景 | 简单 | 10s以上 |
云直播拉流转推 | 云直播 | 使用云直播拉流转推能力,可将一个文件作为拉流来源,适用于伪直播任务数量较少的场景。 | 中 | 根据播放协议不同,webtrc<rtmp<flv<HLS |
SAAS服务 | 导播台SAAS | 通过云导播台能力,通过图形页面操作转推,适用于无开发人员,开箱即用的场景 | 简单 | 同上 |
serverless+TRTC | 云函数+TRTC | 基于serverless+实时音视频技术,适用于为超低延迟及互动连麦场景 | 中 | 1S > T >300ms |
serverless+云直播 | 云函数+快直播/标准直播 | 基于serverless+实时音视频技术,适用于较低延迟及纯观看场景 | 简单 | 根据播放协议不同,通常延迟webtrc<rtmp<flv<HLS |
伪直播依托于点播的播放控制能力,将点播文件增加“限制观看时间”和“同步观看进度”两种访问控制的功能,使点播文件达成类直播效果,用户可以首先生成点播文件,在指定的直播时间使用点播文件进行类直播分发,有效的降低直播的风险与成本
使用限制:
该方案中伪直播本质上是点播,因此并不具备标准直播的一些能力,例如:
腾讯云直播控制台提供拉流转推工具,若您直播源无推流能力或点播视频内容需通过直播形式分发,拉流转推服务提供内容拉取并推送的功能,无需进行直播推流,即可快速拉取已有的视频/直播,推送到目标地址上。
云导播台集成轮播功能,提供丰富的直播编辑能力。
当用户业务场景需要支持超低延迟观看,并且同时支持主播及观众连麦互动场景,serverless云函数提供开箱即用、灵活便捷、可编程的在线媒体流输入能力,支持将已有的录播视频或者 RTMP 直播流推送到实时音视频 TRTC 房间进行直播
以上四种方案在腾讯云官网已经有较为详细的文档,接下来以serverless+快直播webrtc为例,介绍云函数+快直播实现伪直播的示例
serverless+云直播的的方式与上文TRTC的方式类似,只是将TRTC替换为云直播:
实现步骤:
参考 云直播地址生成器
1 使用 Postman 构造 HTTP 请求,传入点播文件地址和直播rtmp推流地址,其中文件地址为对象存储文件地址,快直播和普通直播的推流地址为同一个
2 请求发送后会收到异步函数响应 “Async run task submitted”
3 在“函数详情”页面中选择【日志查询】页签,查看函数执行状态
4 使用播放器观看快直播或标准直播地址
快直播需要用webrtc播放,参考: 腾讯云webrtc播放器demo
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": ""
}
以上伪直播方案仅提供内容拉取与推送服务,请确保内容已获得授权并符合内容传播相关的法律法规。若因版权问题或内容违规,云直播会停止相关的功能服务并保留追究法律责任的权利。
参考文档:
2 云直播拉流转推
5 云直播地址生成器
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。