有奖捉虫:云通信与企业服务文档专题,速来> HOT
播放器签名,用于 App 播放服务对终端的授权播放。如下图步骤 6 所示,若 App 播放服务允许终端播放,则派发一个合法的签名。终端在签名有效时间内可以播放视频内容。


下面,将介绍播放器签名的参数组成和生成规则。

签名参数

参数名称
必选
类型
说明
appId
Integer
点播应用 appId。
fileId
String
点播文件 ID。
contentInfo
Object
对应点播文件 ID 播放的具体内容,为 ContentInfo 类型,可播放下列三种中的一种:
转自适应码流 的输出音视频,可以是未加密或加密的。
转码 的输出音视频。
上传 的原始音视频。
currentTimeStamp
Integer
派发签名当前 Unix 时间戳。
expireTimeStamp
Integer
派发签名到期 Unix 时间戳,不填表示不过期。
urlAccessInfo
Object
播放链接访问配置参数,包括 Key 防盗链 配置、播放域名与协议参数,为 UrlAccessInfo 类型
drmLicenseInfo
Object
DRM License 配置参数,为 DrmLicenseInfo 类型
ghostWatermarkInfo
Object
幽灵水印参数配置,为 GhostWatermarkInfo 类型

ContentInfo 类型

参数名称
必选
类型
说明
audioVideoType
String
播放的音视频类型,可选值:
RawAdaptive:未加密的 转自适应码流 输出。
ProtectedAdaptive:私有加密或 DRM 保护的 转自适应码流 输出。
Transcode:转码 后输出。
Original:上传 的原始音视频。
rawAdaptiveDefinition
Integer
允许输出的未加密的 转自适应码流模板 ID,仅当 audioVideoType 为 RawAdaptive 该参数必填且有效。
drmAdaptiveInfo
Object
允许输出的加密保护的 转自适应码流模板 ID,仅当 audioVideoType 为 ProtectedAdaptive 该参数必填且有效,为 DRMAdaptiveInfo 类型
transcodeDefinition
Integer
允许输出的 转码模板 ID,仅当 audioVideoType 为 Transcode 该参数必填且有效。
imageSpriteDefinition
Integer
用于进度条预览的 雪碧图模板 ID。
resolutionNames
Array of Object
播放器对于不同分辨率的子流展示名字,为 ResolutionNameInfo 类型 数组。不填或者填空数组则使用默认配置:
MinEdgeLength:240,Name:240P。
MinEdgeLength:480,Name:480P。
MinEdgeLength:720,Name:720P。
MinEdgeLength:1080,Name:1080P。
MinEdgeLength:1440,Name:2K。
MinEdgeLength:2160,Name:4K。
MinEdgeLength:4320,Name:8K。

DRMAdaptiveInfo 类型

参数名称
必选
类型
说明
privateEncryptionDefinition
Integer
widevineDefinition
Integer
fairPlayDefinition
Integer

ResolutionNameInfo 类型

参数名称
必选
类型
说明
MinEdgeLength
Integer
视频短边长度,单位:像素。
Name
String
展示名字。

UrlAccessInfo 类型

参数名称
必选
类型
说明
t
String
16进制字符串,表示链接的过期时间。
具体含义和取值参见 防盗链参数 中的 t 参数。
不填表示不过期。
exper
Integer
试看时长,单位为秒,以十进制表示。
如果要指定试看时长,时长必须不小于30秒。
具体含义和取值参见 防盗链参数 中的 exper 参数。
rlimit
Integer
最多允许多少个不同 IP 的终端播放,以十进制表示。
具体含义和取值参见 防盗链参数 中的 rlimit 参数。
us
String
链接标识,用户增强链接的唯一性。
具体含义和取值参见 防盗链参数 中的 us 参数。
domain
String
播放时使用的域名。不填或者填 Default,表示使用 默认分发配置 中的域名。
scheme
String
播放时使用的 Scheme。不填或者填 Default,表示使用 默认分发配置 中的 Scheme。其他可选值:
HTTP。
HTTPS。
uv
String
6 位十六进制字符,用于 溯源水印 场景。

DrmLicenseInfo 类型

参数名称
必选
类型
说明
persistent
String
是否允许终端持久化保存商业级 DRM 播放许可证。取值范围:
ON: 允许持久化保存;
OFF: 不允许持久化保存。
默认取值为 OFF。
rentalDuration
Integer
当 persistent 为 ON 时,商业级 DRM 播放许可证允许被持久化保存的时长,单位为秒,不填表示不限时长。
forceL1TrackTypes
Array of String
当使用 Widevine 时,要求终端必须使用 L1 安全级别处理的 Track 类型。其中,未指定的 Track 类型默认使用 L3 安全级别处理。取值范围如下:
AUDIO: 音频子流;
SD: 短边小于720的子流;
HD: 短边大于等于720并小于2160的子流;
UHD1: 短边大于等于2160并小于4320的子流;
UHD2: 短边大于等于4320的子流。

GhostWatermarkInfo 类型

参数名称
必选
类型
说明
text
String
幽灵水印内容。长度不超过64个字符。
说明:
如果您使用了 子应用,则 appId 参数需要填子应用 AppId。
签名参数中的 texperrlimitus 的含义和取值,与 防盗链参数 中的同名参数完全一致。

签名计算

点播播放器签名采用 JWT(JSON Web Token),一种由 Header、PayLoad 和 Key 计算并组合得到的数字令牌。
Header 为 JSON 格式,表示 JWT 使用的算法信息,固定使用如下内容:
{
"alg": "HS256",
"typ": "JWT"
}

PayLoad

Payload 为 JSON 格式,是播放器签名参数的内容,例如:
{
"appId": 1255566655,
"fileId": "4564972818519602447",
"contentInfo": {
"audioVideoType": "RawAdaptive",
"rawAdaptiveDefinition": 10,
"imageSpriteDefinition": 10
},
"currentTimeStamp": 1663064276,
"expireTimeStamp": 1663294210,
"urlAccessInfo": {
"t": "6323e6b0",
"rlimit": 3,
"us": "72d4cd1101"
}
}

Key

Key 是计算签名时使用的密钥,这里使用 默认分发配置 中的播放密钥

计算公式

1. 计算 Signature: Signature = HMACSHA256(base64UrlEncode(Header) + "." + base64UrlEncode(Payload), Key)
2. 计算 Token: Token = base64UrlEncode(Header) + '.' + base64UrlEncode(Payload) + '.' + base64UrlEncode(Signature) 最终得到的 Token,即为点播播放器签名。
说明:
HMACSHA256 请参见 RFC - HMACSHA256。base64UrlEncode 请参见 RFC - base64UrlEncode
为方便您计算签名以及验证签名,云点播控制台提供了签名生成工具和校验工具:

计算示例

例如,某用户 appId 是 1255566655,fileId 是 4564972818519602447的视频生成播放器签名,并且:
播放密钥为 TxtyhLlgo7J3iOADIron
播放器签名的派发时间为 2022-09-13 18:17:56,对应的 Unix 时间是 1663064276
播放器签名的过期时间为 2022-09-16 10:10:10,对应的 Unix 时间是 1663294210
防盗链的过期时间为 2022-09-16 11:00:00,对应的 Unix 时间是 6323e6b0
限制最多允许 3 个不同的 IP 播放 URL。
生成的随机字符串是 72d4cd1101
则签名步骤如下:
1. Header 的内容为:
{
"alg": "HS256",
"typ": "JWT"
}
经过 base64UrlEncode 后的结果是: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
2. Payload 的内容为:
{
"appId": 1255566655,
"fileId": "4564972818519602447",
"contentInfo": {
"audioVideoType": "RawAdaptive",
"rawAdaptiveDefinition": 10,
"imageSpriteDefinition": 10
},
"currentTimeStamp": 1663064276,
"expireTimeStamp": 1663294210,
"urlAccessInfo": {
"t": "6323e6b0",
"rlimit": 3,
"us": "72d4cd1101"
}
}
经过 base64UrlEncode 后的结果是: eyJhcHBJZCI6MTI1NTU2NjY1NSwiZmlsZUlkIjoiNDU2NDk3MjgxODUxOTYwMjQ0NyIsImNvbnRlbnRJbmZvMSI6eyJhdWRpb1ZpZGVvVHlwZSI6IlJhd0FkYXB0
aXZlIiwicmF3QWRhcHRpdmVEZWZpbml0aW9uIjoxMCwiaW1hZ2VTcHJpdGVEZWZpbml0aW9uIjoxMH0sImN1cnJlbnRUaW1lU3RhbXAiOjE2NjMwNjQyNzYsImV4
cGlyZVRpbWVTdGFtcCI6MTY2MzI5NDIxMCwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiNjMyM2U2YjAiLCJybGltaXQiOjMsInVzIjoiNzJkNGNkMTEwMSJ9fQ
3. 以播放密钥作为 Key(即 TxtyhLlgo7J3iOADIron)进行 HMAC 计算,Signature 是: QFcBX9830ysTzJIyZxoOlRmNb2Gqy2fns9yOfriaDI8
4. 最终 Token 是: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6MTI1NTU2NjY1NSwiZmlsZUlkIjoiNDU2NDk3MjgxODUxOTYwMjQ0NyIsImNvbnRlbnRJbmZvMSI6eyJhdWRpb1ZpZGVvVHlwZSI6IlJhd0FkYXB0aXZlIiwicmF3QWRhcHRpdmVEZWZpbml0aW9uIjoxMCwiaW1hZ2VTcHJpdGVEZWZpbml0aW9uIjoxMH0sImN1cnJlbnRUaW1lU3RhbXAiOjE2NjMwNjQyNzYsImV4cGlyZVRpbWVTdGFtcCI6MTY2MzI5NDIxMCwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiNjMyM2U2YjAiLCJybGltaXQiOjMsInVzIjoiNzJkNGNkMTEwMSJ9fQ.QFcBX9830ysTzJIyZxoOlRmNb2Gqy2fns9yOfriaDI8

代码示例

云点播提供了 Python、Java、Go、C#、PHP 和 Node.js 等多种语言的播放器签名的代码示例,具体请参见 播放器签名 - 签名示例

常见错误

如果您使用播放器签名,播放器 SDK 返回了错误码,较为常见的原因有:
签名计算 KEY 用错,应该使用 默认分发配置 中的播放密钥,您可自查下是否误用为 KEY 防盗链参数 中的KEY参数。
签名参数 填错,如:
参数类型错误:例如 appId 为整型,错填为appId:"125000123"(字符串型);又例如contentInfo里的转码模板参数为整型,错填为 transcodeDefinition: "14011"(字符串型)。
参数取值超出有效范围:例如contentInfo里的播放的音视频类型参数,错填为audioVideoType: "Transocde"(拼写错误,不是有效的枚举值)。