重要提示:本篇加密文档为旧版加密文档,请使用新版加密播放(自适应码率的加密视频、并且不需要在业务侧写返回密钥逻辑的都是新版)的用户不要使用该文档提供的代码进行加密播放。
这篇文章是对加密过程中的细节及容易疏漏的地方进行补充和说明,在此之前,需要您对加密视频有一个大概了解,点击查看官方文档。
名词解释
密钥:又称key,用于加密/解密资源文件。
密钥服务器:客户端服务器,用于业务方管理密钥存储、分发的业务服务器,播放器在播放视频文件之前需要到该服务器获取密钥。
解密密钥服务器域名:又称getkeyurl,简称“解密密钥域名”,即密钥服务器的域名,在开通视频加密服务时需要将该域名登记到腾讯云云点播。
token:业务端用户的身份标识,播放器请求获取密钥时会携带token,密钥服务器对token进行鉴权,只有携带token合法的请求才能获得到密钥。
注意事项
1、解密密钥格式确认
解密密钥是一段长度为16字节的二进制数据,且开头和结尾不能为空白字符。
如何判断返回的密钥格式是否正确?
在浏览器器中打开开发者工具,在network里选择获取密钥的请求,如下图。如果返回的密钥长度不对或密钥前后有空白,则需要检查密钥服务器返回密钥的逻辑。
2、“HLS普通加密”和“DRM商业加密”的调用参数区别
腾讯云目前推出了两种加密方案:1、HLS普通加密;2、DRM商业加密。
两种加密方案在Web播放器里播放时需要配置的参数有区别,参数配置不对会导致无法播放加密视频。
HLS普通加密代码示例:
代码语言:javascript复制var player = TCPlayer('player-container-id', {
fileID: '', // 请传入需要播放的视频 filID(必须)
appID: '' // 请传入点播账号的 appID(必须)
});
HLS普通加密里的token属于非必填参数,如需使用token可以点击查看demo。
DRM商业加密代码示例:
代码语言:javascript复制var player = TCPlayer('player-container-id', {
appID: '', // 请传入点播账号的 appID(必须)
fileID: '', // 请传入需要播放的视频 fileID(必须)
playDefinition: '' // 请传入播放模版,播放 DRM 内容必须
plugins: {
DRM: {
token: '', // 传入您的后台服务签发的 token,播放 DRM 内容必须
certificateUri: '', // 传入 FairPlay 证书的下载地址,播放 FairPlay 加密内容必须
}
}
});
3、浏览器跨域访问处理
如果含播放器的Web页面的域名(或者Flash插件的域名)与密钥服务器域名不一致,则密钥服务器需要配置 CORS 策略(或corssdomain.xml),允许 JavaScript 和 Flash 插件跨域获取解密密钥。
跨域的场景分两种:H5模式和Flash模式
H5模式(Chrome、Firefox或其他浏览器极速模式下是H5模式)
如果播放页面与解密密钥服务器域名不一致,这个时候需要在密钥服务器配置 CORS 策略,允许 JavaScript 跨域获取解密密钥。
CORS 策略配置参考:
代码语言:javascript复制<CORSConfiguration>
<CORSRule>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedOrigin>*</AllowedOrigin>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>7200</MaxAgeSeconds>
<ExposeHeader>ETag</ExposeHeader>
<ExposeHeader>x-cos-request-id</ExposeHeader>
</CORSRule>
</CORSConfiguration>
Flash模式下(IE浏览器及其他浏览器兼容模式下是Flash模式)
1、如果 Flash 插件地址 与密钥服务器的域名不一致,则需要在密钥服务器的 Web 服务根目录配置 corssdomain.xml ,允许 Flash 跨域获取解密密钥。
corssdomain.xml 配置参考如下:
代码语言:javascript复制<?xml version=”1.0″ encoding="UTF-8"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
注:腾讯云Web播放器的 Flash 插件文件默认存放在 imgcache.qq.com 域名下,可自行下载 swf 文件并部署到自己的 Web 服务器上。
2、播放页面与解密密钥服务器协议不一致。
在 Flash 模式下,注意保证协议一致。如果播放页面的协议是 http,而获取解密密钥地址的协议是 https,播放器到密钥服务器获取解密密钥时会被浏览器拦截,导致无法播放。
4、返回的密钥是 gzip 压缩过的
如果在密钥服务器的 Web 服务中配置过 gzip 压缩(或其他压缩方式),直接使用压缩后的密钥会导致解密失败,需要业务方先自行解压,返回给播放器非压缩形式的密钥来进行解密。
如何检查密钥是否经过压缩?
打开浏览器的开发者工具,在network里选择获取密钥的请求,如下图,查看请求的Response Headers 中是否带有 Content-Encoding:gzip(或其他压缩方式)。若返回正常的密钥,则 Response Headers 中的 Content-Length 为 16 字节。
5、视频只能进行一次加密,不可多次加密
若一个视频进行转码加密超过一次,会导致视频无法播放。
6、密钥服务器的获取密钥逻辑问题
HLS 方式播放的视频是由若干个 TS 分片组成,在大部分安卓微信端进行播放时,每加载一个 TS 分片都需要获取一次密钥解密,如果密钥服务器上获取密钥的接口只允许一次请求,会导致视频播放几秒后无法播放。
常见问题
Q1:播放器怎么播放加密视频?
当播放器获取到加密视频时,会发送请求到解密密钥服务器获取密钥,然后解密播放。发送请求获取密钥以及解密播放的工作由播放器完成,返回密钥的工作由业务端服务器完成。
Q2:token 参数是否必填?
token 不是必填参数。
加密视频在转码时就已进行过加密操作,token 是客户端播放器访问加密视频时的鉴权操作,如果不需要客户端再进行鉴权,可以不填写。
Q3:怎样将 token 传给播放器?
目前腾讯云Web点播播放器有两个,传递token如下:
A、通过腾讯云Web超级播放器通过参数传递,参考示例:
代码语言:javascript复制var player = TCPlayer('player-container-id', {
fileID: '', // 请传入需要播放的视频 filID(必须)
appID: '' // 请传入点播账号的 appID(必须)
plugins:{
HLSToken: {
token: ''//传入token
}
}
});
B、通过腾讯云TCPlayerLite播放则需要将token拼接到视频url里面,再将视频url传给播放器。
Q4:HLS普通加密是否支持和Key防盗链一起使用?
答:支持。
参考示例:
代码语言:javascript复制var player = TCPlayer('player-container-id', {
fileID: '', // 请传入需要播放的视频 filID(必须)
appID: '', // 请传入点播账号的 appID(必须)
t: '',
us: '',
sign:''
});