文档

直播时移

更新时间:

直播时移可以回看从直播开始时间到当前时间之间的直播视频。通过阅读本文,您可以了解直播时移的实现原理及请求方式。

实现原理

视频直播流会被切成TS切片,通过HLS协议向播放用户分发,用户请求的M3U8播放列表中包含不断刷新的TS切片地址。对于常规的HLS直播,TS切片地址及对应的TS文件无法保存,因此当前时间之前的视频直播内容无法进行回溯。在开启直播时移功能后,TS切片信息以及文件会进行保存,从而实现从直播开始时间到当前时间之间的视频回溯功能。

使用限制

直播时移最大支持直播观看人数为10万人,如果需要支持更多人观看,请提交工单。关于如何提交工单,请参见联系我们

使用场景

直播时移功能可以让直播观众在直播过程中回看直播内容。比如在进行赛事直播时,通过时移功能可以让观众像观看影视剧一样,回看赛事内容。

目前视频直播有三种功能支持对直播内容进行回看,直播录制直播时移直播截图(直播截图只能按频率对直播内容进行截图保存,不适用于播放场景)。

其中直播录制功能偏向直播结束后对直播内容进行播放,直播时移偏向直播过程中观众端对直播内容进行回放。

说明

了解直播录制与直播截图功能,请参见直播录制直播截图

功能使用

说明
  • 使用直播时移功能会产生直播时移费用,按时移写入量、时移回看规格计费。计费规则详见直播时移费用

  • 直播时移功能服务地域请参见服务地域

使用直播时移,分两部分内容:

  1. 进行直播时移功能配置。

    说明

    功能需要配置,才能将直播内容进行保存从而支持时移功能。

  2. 观众端发起请求使用时移功能。

配置直播时移功能

视频直播目前支持两种方式进行直播时移功能配置。

方式一:通过控制台操作,详见配置直播时移

方式二:通过调用OpenLiveShiftAPI开启时移服务。

 
//需要<>内容替换成实际使用的值
DefaultProfile profile = DefaultProfile.getProfile("<regionId>", "<ALIBABA_CLOUD_ACCESS_KEY_ID>", "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>");
IAcsClient client = new DefaultAcsClient(profile);
OpenLiveShiftRequest openLiveShiftRequest = new OpenLiveShiftRequest();
openLiveShiftRequest.setDomainName("<DomainName>");
openLiveShiftRequest.setAppName("<AppName>");
openLiveShiftRequest.setStreamName("<StreamName>");
//数据保留时长,单位天,取值(1-30),默认值7
openLiveShiftRequest.setVision("<7>");
//是否忽略对应转码流生成时移数据,true/false,默认值true
openLiveShiftRequest.setIgnoreTranscode("<true>");
//
//其他业务代码
//

try {
    OpenLiveShiftResponse openLiveShiftResponse = client.getAcsResponse(openLiveShiftRequest);
    System.out.println(new Gson().toJson(openLiveShiftResponse));
    // todo something.
} catch (ServerException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClientException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
说明
  • AppName可以设置为星号(*),表示该配置针对于域名下所有直播流有效。

  • StreamName可以设置为星号(*),表示该配置针对于AppName下所有直播流有效。

  • 添加完成后,可调用DescribeLiveShiftConfigs查询指定域名的时移配置。

  • 使用JAVA SDK,具体请参见Java SDK使用说明

  • 重新推流配置才能生效。

使用直播时移功能

配置时移功能后,直播服务将对直播流TS切片文件进行保存,观众端可发起时移播放请求进行直播内容回看。

我们先实现播放一段时移内容,再向您详细介绍时移播放的具体功能,先看一下请求链接:

http://<DomainName>/<AppName>/<StreamName.m3u8>?aliyunols=on&lhs_offset_unix_s_0=300&auth_key=3sdda******

可以发现,时移请求与M3U8格式的直播地址类似,只是多了两个参数,aliyunols=on为固定字段,lhs_offset_unix_s_0=300表示向前偏移300秒。

说明
  • 通过CDN调用时移请求时必须携带aliyunols=on参数。

  • 目前时移播放只能使用M3U8格式直播地址。

  • 推荐您使用阿里云播放器播放时移内容,关于阿里云播放器使用可参见播放器SDK

在该示例中,我们实现了回退300秒观看直播内容,在播放时移内容时通过lhs_offset_unix_s_0参数设置播放时移内容的时间,参数格式为lhs_{type}_{format}_{unit}_{zone}

参数中各变量取值如下:

type

format

unit

zone

时间类型。取值:

  • start:播放开始时间。

  • end:播放结束时间。

  • vodend:以点播形式指定播放结束时间。

    说明

    设置vodend表示使用点播模式回看,一次返回指定时间段内所有的ts,包含endlist标签。

  • offset:向前偏移的时间。

时移的时间格式。取值:

  • unix:UNIX时间戳。

  • human:年月日时分秒。示例:20170809230130。

时移的时间单位。取值:

  • s:秒。

  • ms:毫秒。

时区,取值:0~9,表示东*区。其中,0表示UTC时间,8表示中国时区。

说明

当format取值为unix时,zone取值为0。

时移参数示例如下所示:

  • lhs_start_human_s_8=20170809200010

  • lhs_start_unix_s_0=1502280113

  • lhs_end_human_s_8=20170809200010

  • lhs_vodend_unix_s_0=1502280113

  • lhs_offset_unix_ms_0=1800000(向前时移30分钟)

重要
  • lhs_startlhs_offset必须指定其中一个,如果同时指定lhs_startlhs_offset,时移播放将以lhs_offset为准。

  • lhs_end/lhs_vodend为可选配置,如果不指定lhs_end/lhs_vodend,时移播放会以直播模式播放至直播推流结束。

  • 如果指定了lhs_end,时移播放会以直播模式播放直到指定的lhs_end时间点。

  • 如果指定了lhs_vodend,时移播放会以点播模式播放直到指定的lhs_vodend时间点(点播模式会一次性返回所有ts切片,可以使用播放器进度条控制播放前进回退)。

  • 如果同时指定lhs_endlhs_vodend,时移播放将以lhs_vodend为准。

在您的业务中,如果您无法知道具体的startend时间点,可以通过查询时移时间线获取start和end。

查询时移时间线示例代码如下:

//需要将<>替换成实际使用的值
http://<DomainName>/openapi/timeline/query?aliyunols=on&app=<AppName>&stream=<StreamName>&format=ts&lhs_start_unix_s_0=<StartTime>&lhs_end_unix_s_0=<endTime>&auth_key=<auth_key>

示例说明如下:

名称

描述

请求方式

GET

URL

请求URL,例如:http://{domain}/openapi/timeline/query,其中,{domain}为您的播流域名。

参数

  • aliyunols(required):on。(固定字段)

  • app(required):应用名。

  • stream(required):流名。

  • format(required):ts。(固定字段)

    说明

    目前接口只支持查询ts格式的时移数据。

  • lhs_start_unix_s_0(required):查询区间开始时间的时间戳(示例值:1724295706)。单位:秒。

  • lhs_end_unix_s_0(required):查询区间结束时间的时间戳(示例值:1724317306)。单位:秒。

  • auth_key:鉴权key,此处鉴权key与播流地址使用的鉴权key采用同一种加密算法,如对鉴权加密暂不了解,请参见文档鉴权代码示例

常见错误处理

  • 403:请检查您auth_key值的加密过程是否正确。

返回示例如下所示:

{
  "retCode": 0,
  "description": "success",
  "content": {
    "current": 1514269063,
    "timeline": [
      {
        "start": 1514269054,
        "end": 1514269058
      }
    ]
  }
}

参数

描述

current

当前系统时间,播放器可以基于这个字段对时。

timeline

有效的时移时间段,包含开始和结束时间戳。

start

有效片段的开始时间(UNIX时间戳),单位:秒。

end

有效片段的结束时间(UNIX时间戳),单位:秒。

说明
  • 一般情况下,一次推流会生成一个timeline对象(start接近于直播开始时间,end接近于current或直播结束时间),但由于断流重推、网络波动等原因可能会出现多个timeline对象。

  • 您可以在控制台查询指定域名时移数据量。更多信息请参见用量查询

进阶使用

时移播放转码流

时移功能可以结合转码功能使用,播放时播放转码流。时移播放转码流,需要先完成转码配置。配置转码功能可参见直播转码

此处假设您已完成转码功能相关配置。

在配置时移功能时,将转码流也生成时移数据,示例代码如下:

//是否忽略对应转码流生成时移数据,true/false,默认值true
openLiveShiftRequest.setIgnoreTranscode("<false>");

然后在转码流地址上增加时移参数,即可以实现时移播放转码流。

播放地址示例如下:

http://<DomainName>/<AppName>/<StreamName_转码模板ID.m3u8>?aliyunols=on&lhs_offset_unix_s_0=300&auth_key=3sdda******
说明
  • 重新推流,即可对转码流进行时移播放。

  • 对于拉流触发转码的转码配置,播放转码流的时移是不能触发转码的,需要提前播放转码流直播触发转码(您也可以将转码配置为推流触发转码)。

时移播放封装流

时移播放封装流是将直播时移功能与直播封装功能结合使用。

说明

阿里云视频直播支持直播封装服务,支持CMAF、LL-HLS(低延迟HLS)等播放协议,可有效降低直播延迟。开启直播封装后,视频直播流会被切成TS或CMAF切片,通过指定的HLS或LL-HLS协议向播放用户分发,用户请求的M3U8播放列表中包含不断刷新的切片地址。相对于HLS,LL-HLS可以将切片分割成更小(0.2~1秒)的Part切片,并支持M3U8和Part切片的阻塞加载,从而实现端到端低至3~5秒的延迟;相对于TS格式,CMAF封装格式有广泛的设备和浏览器支持,且支持更新的编解码器(codec),如H.265。

如果您对直播封装功能暂不了解,请参见文档直播封装

此处假设您已完成直播封装功能配置。

实现时移播放封装流,不需要对时移功能配置做出修改,只需要将封装流地址增加时移参数即可。

播放地址示例如下:

http://<DomainName>/<AppName>/<StreamName-封装格式.m3u8>?aliyunols=on&lhs_offset_unix_s_0=300&auth_key=3sdda******
说明
  • 重新推流,即可对封装流进行时移播放。

  • 如果需要时移播放封装转码流,只需在封装转码流地址上增加时移参数即可。

相关文档

直播时移相关API,请参见直播时移