腾讯云伪直播方案介绍

2021-07-12 09:22:27 浏览数 (2)

随着云原生、直播技术的不断发展,线上授课、重大赛事、网剧轮播等直播场景不断丰富,很多直播平台已经在以上场景都支持了伪直播功能,本文对腾讯云现有的各种伪直播方案进行梳理,并针对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 创建云函数

  1. 登录云函数控制台,选择左侧导航栏中的【函数服务】。
  2. 在“函数服务”页面上方选择地域,并单击【新建】进入新建函数页面,模糊搜索"rtmp",选择“视频文件转RTMP模板”进入下一步。如下图所示:
可使用模板函数修改业务逻辑可使用模板函数修改业务逻辑

5.2 准备直播推流及播放地址

参考 云直播地址生成器

注意UDP格式地址即为快直播地址注意UDP格式地址即为快直播地址

5.3 测试函数功能

1 使用 Postman 构造 HTTP 请求,传入点播文件地址和直播rtmp推流地址,其中文件地址为对象存储文件地址,快直播和普通直播的推流地址为同一个

2 请求发送后会收到异步函数响应 “Async run task submitted”

3 在“函数详情”页面中选择【日志查询】页签,查看函数执行状态

4 使用播放器观看快直播或标准直播地址

快直播需要用webrtc播放,参考: 腾讯云webrtc播放器demo

webtrc playerwebtrc player

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 云直播地址生成器

0 人点赞