前言
我们日常在观看体育赛事、电竞赛事中对于一些精彩时刻都会有在直播过程中有“精彩回放”时刻,让我们进一步品味精彩瞬间。如果在使用腾讯云直播时,也有业务场景需要在直播过程中对过往内容中选择一段,实时生成一个新的视频,供即时播放回看或者分享出去,那么可以参考本文提供的方法来实现此类需求。
方案主要使用以下腾讯云服务:
·云直播CSS
·云点播VOD
解决方案
主要有两种场景,分别为直播指定时移时长回看和即时剪辑,区别为前者不需要生成新的文件,接下来我们分别看下这两种场景下的具体应用。
场景一:
如果业务场景只需要直播时可以指定时移时长回看并不需要将精彩片段固化或单独形成文件分享出去,这里便可以通过直播时移来实现;
直播时移功能依托于云直播的录制能力,录制格式为HLS,通过将 TS分片地址和 TS 文件单独存放,保存于云点播系统中;客户端通过时移播放域名传入时间参数,可以播放当前时间之前的精彩视频内容。
1.首先需要在控制台开通腾讯云直播服务和云点播服务,并分别在云直播控制台添加推流域名,云点播控制台添加云点播分发域名(此域名后面会作为时移播放域名),将域名做好对应的cname解析配置;
2.在直播控制台配置一个录制类型为HLS格式的录制模板,模板配置的存储时长不得短于需求的时移时长,并将录制模板关联到所需配置的推流域名;
3.最后提交工单给工程师,提供上面配置的点播域名、录制模板ID和需要自定义时移时长timeshift_dur等信息,提出开通云直播时移服务申请要求。
在工程师开启时移之后,可以在推流之后通过如下方式请求测试时移效果:
时移播放请求url格式:
http://[Domain]/timeshift/[AppName]/[StreamName]/timeshift.m3u8?delay=xxx
参数说明:
参数 | 说明 |
---|---|
[Domain] | 您注册的时移服务访问域名,即您在云点播控制台上添加的 时移播放域名 |
timeshift | 固定字段,无须修改 |
[AppName] | 应用名称,若您的应用名称是 live,那么请填 live |
[StreamName] | 流名称,填您请求对应的流名称 |
timeshift.m3u8 | 固定字段,无须修改 |
delay | 表示相对时移时长,单位秒。目前该值小于90时 后台默认调整成90 |
示例:
假设当前推流域名为pushtest.myqcloud.com,Appname为live,流名称为QQTXTeR,配置的时移播放域名为testtimeshift.com。
对应的推流链接为:
rtmp://pushtest.myqcloud.com/live/QQTXTeR?txSecret=xxxxx&txTime=xxxxx
此时若您需要时移观看该地址6分钟前的直播内容,则请求 URL 如下:
http://testtimeshift.com/timeshift/live/QQTXTeR/timeshift.m3u8?delay=360
注意:
o 时移时长:指时移可以看多长时间的内容(目前最长可配置时移7天内的内容)。
o 此项并不保证绝对精准,按需求配置的前提下,建议多加一小段时间。
o 假设配置为7200(2小时):表示当前可请求2小时前到现在的时移内容(即 delay 相对时移时长可为90s - 2小时);时移超过2小时前的内容,即使有直播内容,也会返回404。
场景二:
当我们需要不仅仅只是要在直播中做时移回看,有更多的业务场景需要在直播过程中,对过往直播内容中任意选择一段,实时生成一个新的视频(HLS 格式),用户可以将其立即分享出去,或者长久保存起来。这种场景可以通过时移云点播提供的“直播即时剪辑”接口LiveRealTimeClip 来实现。
直播即时剪辑功能的使用前提是需要直播流按照场景一中的方式开启直播时移功能,即时剪辑是基于直播录制生成的 m3u8 文件进行的,故而其最小剪辑精度为一个 ts 切片,无法实现秒级或者更为精确的剪辑精度。
腾讯云点播支持两种即时剪辑模式:
·剪辑固化:是指将剪辑出来的视频单独保存为一个文件(拥有独立的点播FileId)。独立于原始直播录制存在,与直播录制隔离,原始录制视频被删除后,不会收到影响。因为是一个独立的点播文件,可以对「精彩时刻」进行视频转码、编辑、微信发布等二次处理。
·剪辑不固化:是指剪辑得到的结果(m3u8 文件)与直播录制视频共享 ts 分片,非独立视频文件,没有点播FileId,只有播放 URL。生命周期依赖直播录制文件,如果直播录制被删除,将无法播放。因为不是一个独立的点播文件,不会出现在控制台点播媒资视频管理页面,进而无法对剪辑片段进行点播视频处理、转码、微信发布等操作,适用于将「精彩时刻」临时分享的场景。
使用方法:
对应API接口名称:LiveRealTimeClip ,可以使用API Explorer或者对应sdk来调用该接口,详细的接口参数说明可参考文档:https://cloud.tencent.com/document/product/266/32587
调用示例(以python为例):
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.vod.v20180717 import vod_client, models
try:
cred = credential.Credential("AKIDxxxxxxxxx", "Trxxxxxxxxxxxx")
httpProfile = HttpProfile()
httpProfile.endpoint = "vod.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = vod_client.VodClient(cred, "", clientProfile)
req = models.LiveRealTimeClipRequest()
params = {
"StreamId": "hyxxx",
"StartTime": "2020-11-24T12:43:00Z",
"EndTime": "2020-11-24T12:44:00Z",
"IsPersistence": 1,
"Host": "testtimeshift.com",
"SubAppId": xxxxxxxx
}
req.from_json_string(json.dumps(params))
resp = client.LiveRealTimeClip(req)
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
返回结果示例:
{
"Response": {
"FileId": "528xxxxxxxxxx",
"Url": "http://testtimeshift.com/xxx/xxxxxxx/playlist.m3u8",
"VodTaskId": "xxxxxx-Procedure-exxxxxxxxxxx",
"MetaData": null,
"RequestId": "495aa58a-xxxx-471a-8d38-xxxxxxxxxx"
}
}
这样便可以使用上面返回结果里面的url直接做精彩时刻回放了(上面示例是将IsPersistence设置为1做了剪辑固化,默认值为0表示不固化)。
小结
本文介绍的直播时移和即时剪辑功能都可以实现“精彩时刻”的回看,即时剪辑相当于在时移基础上可以生成一个完全独立的HLS文件来做分享和固化存储使用,可以根据不同的业务场景需求来合理使用这两种方式。