首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WEB端—(旧版)HLS普通加密视频注意事项及常见问题

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

原创
作者头像
榴莲很好吃
修改于 2020-09-23 03:21:58
修改于 2020-09-23 03:21:58
3K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

名词解释

密钥:又称key,用于加密/解密资源文件。

密钥服务器:客户端服务器,用于业务方管理密钥存储、分发的业务服务器,播放器在播放视频文件之前需要到该服务器获取密钥。

解密密钥服务器域名:又称getkeyurl,简称“解密密钥域名”,即密钥服务器的域名,在开通视频加密服务时需要将该域名登记到腾讯云云点播

token:业务端用户的身份标识,播放器请求获取密钥时会携带token,密钥服务器对token进行鉴权,只有携带token合法的请求才能获得到密钥。

注意事项

1、解密密钥格式确认

解密密钥是一段长度为16字节的二进制数据,且开头和结尾不能为空白字符。

播放器播放加密视频流程图
播放器播放加密视频流程图

如何判断返回的密钥格式是否正确?

在浏览器器中打开开发者工具,在network里选择获取密钥的请求,如下图。如果返回的密钥长度不对或密钥前后有空白,则需要检查密钥服务器返回密钥的逻辑。

 查看密钥的步骤
查看密钥的步骤
查看密钥的长度
查看密钥的长度

2、“HLS普通加密”和“DRM商业加密”的调用参数区别

腾讯云目前推出了两种加密方案:1、HLS普通加密;2、DRM商业加密。

两种加密方案在Web播放器里播放时需要配置的参数有区别,参数配置不对会导致无法播放加密视频。

HLS普通加密代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var player = TCPlayer('player-container-id', {
    fileID: '', // 请传入需要播放的视频 filID(必须)
    appID: '' // 请传入点播账号的 appID(必须)
});

HLS普通加密里的token属于非必填参数,如需使用token可以点击查看demo。

DRM商业加密代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<?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
代码运行次数:0
运行
AI代码解释
复制
var player = TCPlayer('player-container-id', {
    fileID: '', // 请传入需要播放的视频 filID(必须)
    appID: '' // 请传入点播账号的 appID(必须)
    plugins:{
      HLSToken: {
        token: ''//传入token
        }
       }
 });

B、通过腾讯云TCPlayerLite播放则需要将token拼接到视频url里面,再将视频url传给播放器。

Q4:HLS普通加密是否支持和Key防盗链一起使用?

答:支持。

参考示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var player = TCPlayer('player-container-id', {
     fileID: '', // 请传入需要播放的视频 filID(必须)
     appID: '', // 请传入点播账号的 appID(必须)
     t: '',
     us: '',
     sign:''
});

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM 对象分配过程
逃逸分析(Escape Analysis)简单来讲就是,Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在 Java 堆上分配内存的一项技术。
斯武丶风晴
2020/05/09
1.1K0
JVM 对象分配过程
对象并不一定都是在堆上分配内存的
关于JVM的内存结构及内存分配方式,不是本文的重点,这里只做简单回顾。以下是我们知道的一些常识:
爱撸猫的杰
2019/03/28
7190
jvm之逃逸分析解读
在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。 
一个风轻云淡
2023/10/15
2390
8.JVM内存分配机制超详细解析
之前研究过类的加载过程。具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html
用户7798898
2021/10/15
1.6K0
java栈内存初始化,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧…
虚拟机遇到一条new指令(new关键字、对象的克隆、对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被加载过,如果没有那么就去加载该类
全栈程序员站长
2022/08/28
3380
java栈内存初始化,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧…
深入分析JVM逃逸分析对性能的影响
逃逸分析(Escape Analysis) 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。 方法逃逸的几种方式如下: public class EscapeTest { public static Object obj; public void globalVariableEscape() { // 给全局变量赋值,发生逃逸
java404
2018/05/18
1.4K0
JVM简介—1.Java内存区域
Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域,这些区域各有各的用途以及各自的创建和销毁时间也不一样。有的区域会随着虚拟机的进程启动而存在,有的区域则依赖用户线程的启动和结束而进而跟着建立和销毁。
东阳马生架构
2025/03/10
690
JVM堆
堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。
麋鹿大哥
2020/08/19
4070
Java 对象都是在堆上分配内存吗?
来源:LittleMagic jianshu.com/p/8377e09971b8
用户1516716
2019/12/10
1.1K0
Java 对象都是在堆上分配内存吗?
Java的对象一定是在堆上分配的嘛?谁这么说就直接用“逃逸分析”反驳他!
之前在和朋友聊天的时候,他突然问我什么是“逃逸分析”。说实话当时我还真不太能完整的讲出什么是逃逸分析。这玩意虽然我看八股的时候经常遇见,但之前还真没专项学习过。因此我们今天来完整的介绍一下什么是逃逸分析。
程序员牛肉
2025/01/22
970
Java的对象一定是在堆上分配的嘛?谁这么说就直接用“逃逸分析”反驳他!
JVM之堆
一个进程对应一个jvm实例,同时包含多个线程,这些线==程共享方法区和堆==,每个==线程独有程序计数器、本地方法栈和虚拟机栈==。
程序员阿杜
2021/06/29
9250
面试官:Java中实例对象存储在哪?
低级语言是计算机认识的语言、高级语言是程序员认识的语言。如何从高级语言转换成低级语言呢?这个过程其实就是编译。
Java宝典
2021/03/16
6690
虚拟机--逃逸分析
如果对象发生逃逸,那会分配到堆中。(因为对象发生了逃逸,就代表这个对象可以被外部访问,换句话说,就是可以共享,能共享数据的,无非就是堆或方法区,这里就是堆。)
终码一生
2022/04/14
4430
再清楚不过了,JVM逃逸分析,你一定得知道
提到JVM,相信大家一定知道JVM是什么?但是,提到逃逸分析,相信大多数人都可能一脸懵逼,逃逸分析到底是什么呢?接下来给大家分享一下。
Java程序猿阿谷
2020/12/16
2.4K0
再清楚不过了,JVM逃逸分析,你一定得知道
JVM之堆
约定:新生区 <–> 新生代 <–> 年轻代 、 养老区 <–> 老年区 <–> 老年代、 永久区 <–> 永久代
Java微观世界
2025/01/20
1530
JVM之堆
JVM本地方法栈&堆
上一节我们介绍了程序计数器和Java虚拟机栈,今天我们一起了解一下关于本地方法栈和Java堆的相关知识。
shysh95
2020/07/16
6360
JVM本地方法栈&堆
JVM-彻底搞懂 逃逸分析&标量替换
通过上图的对象分配流程,我们可以知道逃逸分析是发生在第一步判断对象是否可以在栈上分配的时候, 在栈上分配的目的是为了减少将对象分配到堆上的概率,节约堆内存,减少GC压力。
小小工匠
2021/08/17
2.1K0
5. java 对象是如何创建的?new背后到底做了什么
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。
源码之路
2021/03/02
8610
5. java 对象是如何创建的?new背后到底做了什么
【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?
https://github.com/sunshinelyz/mykit-delay
冰河
2020/10/29
2.3K0
【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?
Java对象一定分配在堆上吗?
Java中创建的对象一般会分配到堆上,当堆空间不足时,就会触发GC进行垃圾回收,但是GC次数太多会影响程序的性能。
阿珍
2024/11/04
2300
Java对象一定分配在堆上吗?
相关推荐
JVM 对象分配过程
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档