You need to enable JavaScript to run this app.
导航
播放私有加密视频(新版)
最近更新时间:2025.09.16 11:20:45首次发布时间:2025.09.08 16:04:03
复制全文
我的收藏
有用
有用
无用
无用

火山引擎私有加密是火山引擎视频点播提供的一种高安全级别的视频加密方案,它通过对视频内容和播放密钥进行多重加密,有效防止视频被非法下载和破解,保障您的数字内容资产安全。该功能适用于在线教育、付费课程、版权影视内容分发等对视频安全有高要求的场景。详细信息,请见火山引擎私有加密(新版)。本文详细介绍如何使用 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 环境下进行调试。

前提条件

播放前,请确保您已通过视频点播转码服务输出私有加密视频,详见火山引擎私有加密(新版)

Vid 模式播放

在 Web 播放器 SDK 的 Vid 模式下,整体的解密播放流程如下:
Image

  1. 生成 UnionInfo 和 DrmKek:调用播放器 SDK 的 generateEncryptInfo 接口生成 sessionIddrmKeKunionInfo,示例代码如下:

    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 方法仅需调用一次。调用该方法后,直至播放器完成初始化之前,请勿刷新或跳转页面。

  2. 请求临时播放 Token:携带上一步所生成的 drmKeKunionInfo,向业务的 Web 应用服务端发起请求,以生成临时播放 Token。应用服务端通过视频点播服务端 SDK 本地签发临时播放 Token,然后下发给客户端。服务端在生成 Token 时,需将 FileType 设为 private_evideoJSPlayer 设为 1UnionInfo 设为播放器 SDK 生成的 unionInfoDrmKEK 设为播放器 SDK 生成的 drmKeK。具体示例代码,请见以下文档:

  3. 创建播放器:参考以下示例代码初始化播放器。需将 encryptSessionId 为步骤 1 中 generateEncryptInfo 方法返回的 sessionIddrmType 设为 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 信息
        },
    });
    
  4. 请求播放信息:播放器 SDK 自发向点播服务端发起请求以获取视频信息。点播服务端会对播放密钥进行多次加密处理,从而最大程度地提高密钥的安全性。最终,点播服务端会将视频地址和经过加密的播放密钥返回给播放器 SDK。

  5. 请求加密视频内容:播放器 SDK 内部通过 PlayUrl 向点播 CDN 请求加密视频内容。

  6. 解密播放:播放器 SDK 基于 sessionId 与加密后的播放密钥,解析出真实密钥(此过程于沙盒环境中执行,极难被探测、调试和篡改),最终使用该密钥对视频进行解密并播放。

  7. (可选)切换视频:调用 playNext 方法并传入新视频的临时播放 Token。

    playerSdk.playNext({
      getVideoByToken: {
        playAuthToken: token, // 新的临时播放 Token
      },
    });
    

DirectUrl 模式播放

在 Web 播放器 SDK 的 DirectUrl 模式下,整体的解密播放流程如下:
Image

  1. 生成 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 方法仅需调用一次。调用该方法后,直至播放器完成初始化之前,请勿刷新或跳转页面。

  2. 请求视频地址和播放密钥:携带上一步生成的 drmKeKunionInfo,向业务的 Web 应用服务端发起请求。应用服务端通过视频点播服务端 SDK 调用 GetPlayInfo 接口获取视频播放地址及播放密钥。请求参数中:

    • FileType 设为 private_evideo
    • JSPlayer 设为 1
    • UnionInfo 设为播放器 SDK 生成的 unionInfo
    • DrmKEK 设为播放器 SDK 生成的 drmKeK
      点播服务端在接收到请求后,会对播放密钥进行多次加密处理,从而最大程度地提高密钥的安全性。最终,点播服务端会将视频地址以及加密后的播放密钥返回给业务的 Web 应用服务端,即返回参数中的 PlayAuthId(密钥 ID)和 PlayAuth(加密后的密钥)。
  3. 创建播放器:参考以下示例代码初始化播放器。关注以下参数:

    • encryptSessionId 为步骤 1 中 generateEncryptInfo 方法返回的 sessionId
    • drmType 设为 private_encrypt_upgrade
    • playAuthplayAuthId 设为步骤 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 中的每项均需包含对应的 playAuthplayAuthId

  4. 请求加密视频内容:播放器 SDK 内部通过 PlayUrl 向点播 CDN 请求加密视频内容。

  5. 解密播放:播放器 SDK 基于 sessionId 与加密后的播放密钥,解析出真实密钥(此过程于沙盒环境中执行,极难被探测、调试和篡改),最终使用该密钥对视频进行解密并播放。

  6. (可选)切换视频:调用 playNext 方法并传入新视频的 playAuthplayAuthId

    playerSdk.playNext({
      url: 'newUrl',
      playAuth: 'new playAuth',
      playAuthId: 'new playAuthId'
    });