WEB端—(旧版)HLS普通加密视频注意事项及常见问题

2020-09-23 11:21:58 浏览数 (1)

重要提示:本篇加密文档为旧版加密文档,请使用新版加密播放(自适应码率的加密视频、并且不需要在业务侧写返回密钥逻辑的都是新版)的用户不要使用该文档提供的代码进行加密播放。

这篇文章是对加密过程中的细节及容易疏漏的地方进行补充和说明,在此之前,需要您对加密视频有一个大概了解,点击查看官方文档。

加密视频完整流程图加密视频完整流程图

名词解释

密钥:又称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 字节。

 返gzip形式压缩的响应 返gzip形式压缩的响应
 返回正常的密钥长度 返回正常的密钥长度

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:''
});

0 人点赞