火山引擎私有加密是火山引擎视频点播提供的一种高安全级别的视频加密方案,它通过对视频内容和播放密钥进行多重加密,有效防止视频被非法下载和破解,保障您的数字内容资产安全。该功能适用于在线教育、付费课程、版权影视内容分发等对视频安全有高要求的场景。详细信息,请见火山引擎私有加密(新版)。本文详细介绍如何使用 Web 播放器 SDK,通过 Vid 模式和 DirectUrl 模式播放私有加密视频。
Web 播放器 SDK 支持播放 HLS、MP4 和 DASH 格式的私有加密视频。具体兼容性说明如下表所示。
系统/浏览器 | 说明 |
|---|---|
PC Chrome | 支持 34 以上版本的 HLS、MP4、DASH 的格式/协议。 |
PC Edge | 支持 Windows 10 及以上系统的 HLS、MP4、DASH 的格式/协议。 |
移动端 iOS | 支持 iOS 10 及以上版本系统,请注意不支持 iOS 11.2 至 11.4 版本的系统。仅兼容 HLS 协议。因 iOS 系统浏览器缺乏 MSE 等必要的 API,故无法支持 MP4 格式及 DASH 协议。 |
移动端 Android | 支持 Android 5 及以上版本的系统,支持 HLS、MP4、DASH 格式/协议。需注意,在播放器被劫持的环境下该功能无法正常使用,这类环境包括但不限于 UC 浏览器、QQ 浏览器,以及部分手机厂商自带的浏览器(如 VIVO 手机自带浏览器)。 |
注意
不支持线上 HTTP 环境,但不影响在本地 localhost 及 127.0.0.1 环境下进行调试。
播放前,请确保您已通过视频点播转码服务输出私有加密视频,详见火山引擎私有加密(新版)。
在 Web 播放器 SDK 的 Vid 模式下,整体的解密播放流程如下:
生成 UnionInfo 和 DrmKek:调用播放器 SDK 的 generateEncryptInfo 接口生成 sessionId、drmKeK 和 unionInfo,示例代码如下:
const unionId = 'user_xxxx'; // 设备唯一 ID const format = 'hls'; // 播放私有加密视频格式,取值支持 hls、mp4、dash const {drmKeK, unionInfo, sessionId} = await VePlayer.generateEncryptInfo(unionId, format);
unionId:设备唯一标识符,用于确保密钥与设备一一对应,从而提高安全性。format:所需播放视频的格式。若需播放多种格式的视频,则需多次调用此方法。drmKeK:已混淆的加密公钥,用于后续步骤生成临时播放 Token。unionInfo:设备唯一信息,用于后续步骤生成临时播放 Token。sessionId:私有加密会话标识符,用于后续初始化播放器。说明
generateEncryptInfo 方法仅需调用一次。调用该方法后,直至播放器完成初始化之前,请勿刷新或跳转页面。
请求临时播放 Token:携带上一步所生成的 drmKeK 和 unionInfo,向业务的 Web 应用服务端发起请求,以生成临时播放 Token。应用服务端通过视频点播服务端 SDK 本地签发临时播放 Token,然后下发给客户端。服务端在生成 Token 时,需将 FileType 设为 private_evideo,JSPlayer 设为 1,UnionInfo 设为播放器 SDK 生成的 unionInfo,DrmKEK 设为播放器 SDK 生成的 drmKeK。具体示例代码,请见以下文档:
创建播放器:参考以下示例代码初始化播放器。需将 encryptSessionId 为步骤 1 中 generateEncryptInfo 方法返回的 sessionId,drmType 设为 private_encrypt_upgrade。
const playerSdk = new VePlayer({ id: 'mse', lang: 'zh', width: 640, height: 360, defaultDefinition: '720p', drmType: 'private_encrypt_upgrade', // 加密类型为私有加密(新版) encryptSessionId: sessionId, // generateEncryptInfo 方法返回的 sessionId getVideoByToken: { playAuthToken: 'playAuthToken with unionInfo and KEK', // 应用服务端下发的临时播放 Token,包含 unionInfo 和 drmKeK 信息 }, });
请求播放信息:播放器 SDK 自发向点播服务端发起请求以获取视频信息。点播服务端会对播放密钥进行多次加密处理,从而最大程度地提高密钥的安全性。最终,点播服务端会将视频地址和经过加密的播放密钥返回给播放器 SDK。
请求加密视频内容:播放器 SDK 内部通过 PlayUrl 向点播 CDN 请求加密视频内容。
解密播放:播放器 SDK 基于 sessionId 与加密后的播放密钥,解析出真实密钥(此过程于沙盒环境中执行,极难被探测、调试和篡改),最终使用该密钥对视频进行解密并播放。
(可选)切换视频:调用 playNext 方法并传入新视频的临时播放 Token。
playerSdk.playNext({ getVideoByToken: { playAuthToken: token, // 新的临时播放 Token }, });
在 Web 播放器 SDK 的 DirectUrl 模式下,整体的解密播放流程如下:
生成 UnionInfo 和 DrmKek:调用播放器 SDK 的 generateEncryptInfo 接口生成 sessionId、drmKeK 和 unionInfo,示例代码如下:
const unionId = 'user_xxxx'; // 设备唯一 ID const format = 'hls'; // 播放私有加密视频的格式,取值支持 hls、mp4、dash const {drmKeK, unionInfo, sessionId} = await VePlayer.generateEncryptInfo(unionId, format);
unionId:设备唯一标识符,用于确保密钥与设备一一对应,从而提高安全性。format:所需播放视频的格式。若需播放多种格式的视频,则需多次调用此方法。drmKeK:已混淆的加密公钥。unionInfo:设备唯一信息。sessionId:私有加密会话标识符,用于后续初始化播放器。说明
generateEncryptInfo 方法仅需调用一次。调用该方法后,直至播放器完成初始化之前,请勿刷新或跳转页面。
请求视频地址和播放密钥:携带上一步生成的 drmKeK 和 unionInfo,向业务的 Web 应用服务端发起请求。应用服务端通过视频点播服务端 SDK 调用 GetPlayInfo 接口获取视频播放地址及播放密钥。请求参数中:
FileType 设为 private_evideoJSPlayer 设为 1UnionInfo 设为播放器 SDK 生成的 unionInfoDrmKEK 设为播放器 SDK 生成的 drmKeKPlayAuthId(密钥 ID)和 PlayAuth(加密后的密钥)。创建播放器:参考以下示例代码初始化播放器。关注以下参数:
encryptSessionId 为步骤 1 中 generateEncryptInfo 方法返回的 sessionIddrmType 设为 private_encrypt_upgrade。playAuth 和 playAuthId 设为步骤 2 中获得的密钥 ID 和加密后的密钥。const playerSdk = new VePlayer({ id: 'mse', lang: 'zh', width: 640, height: 360, streamType: 'hls', drmType: 'private_encrypt_upgrade', // 加密类型为私有加密(新版) encryptSessionId: sessionId, // generateEncryptInfo 方法返回的 sessionId url: 'xxx.demo.com/1.m3u8', playAuth: 'YOUR_PLAY_AUTH', playAuthId: 'YOUR_PLAY_AUTH_ID', });
说明
若设置多个清晰度的播放源,实例化参数 playList 中的每项均需包含对应的 playAuth 和 playAuthId。
请求加密视频内容:播放器 SDK 内部通过 PlayUrl 向点播 CDN 请求加密视频内容。
解密播放:播放器 SDK 基于 sessionId 与加密后的播放密钥,解析出真实密钥(此过程于沙盒环境中执行,极难被探测、调试和篡改),最终使用该密钥对视频进行解密并播放。
(可选)切换视频:调用 playNext 方法并传入新视频的 playAuth 和 playAuthId。
playerSdk.playNext({ url: 'newUrl', playAuth: 'new playAuth', playAuthId: 'new playAuthId' });