You need to enable JavaScript to run this app.
导航
HLS 标准加密(新版)
最近更新时间:2025.11.05 16:06:25首次发布时间:2025.08.25 14:10:27
复制全文
我的收藏
有用
有用
无用
无用

HLS 标准加密采用 HTTP Live Streaming 中规定的通用加密方案,使用 AES_128 对视频内容进行加密,适配所有 HLS 播放器,但密钥容易被窃取。您可以在任意支持 HLS 标准加密的播放器进行播放。本文提供 HLS 标准加密的功能介绍、适用场景、工作原理、使用流程等内容。

适用场景

  • 适用于在线教育、财经、独播剧等对内容有强保护需求的领域。
  • 适用于 HLS 规定的播放器均可播放的场景。

费用说明

  • 火山引擎 HLS 标准加密属于免费服务,但需通过视频转码实现加密功能。转码将产生费用,具体计费标准请参考转码计费
  • 经火山引擎 HLS 加密的视频,可使用火山引擎播放器 SDK 或第三方播放器播放。如使用火山引擎播放器 SDK,计费标准请参考播放器 SDK 计费

服务端配置

前提条件

搭建解密服务

使用 HLS 标准加密前,您需要自行搭建并部署一个解密服务。该服务的 URL 需要在后续加密转码流程中配置。工作原理如下:

  1. 播放器在解析 M3U8 文件时,会获取到密钥 URI。
  2. 播放器向该 URI(即您的解密服务)发起请求。
  3. 您的解密服务需要负责验证请求合法性返回正确的密钥
  4. 播放器使用获取到的密钥解密视频内容并播放。

视频点播服务支持以下两种密钥管理模式,您可以根据业务需求选择其一:

在您触发加密转码时,由视频点播服务自动生成和管理解密密钥。该模式的工作原理如下:

  1. 当您的解密服务收到播放器的请求后,需要:
    1. 调用视频点播服务端 SDK 的本地方法 createSha1HlsDrmAuthToken 签发DrmAuthToken
    2. 调用视频点播服务端 SDK 的 GetHlsDecryptionKey 方法获取明文密钥。调用该方法时,您需要传入您在上一步签发的 DrmAuthToken 和密钥 ID。密钥 ID 可以从 GetPlayInfo 接口的返回参数 PlayAuthId 中获取。
  2. 将获取到的明文密钥返回给播放器。

Java 示例代码如下:

package com.volcengine.example.vod.play;

import com.volcengine.service.vod.IVodService;
import com.volcengine.service.vod.impl.VodServiceImpl;

public class VodGetHlsDecryptionKeyDemo {

    public static void main(String[] args) throws Exception {
        IVodService vodService = VodServiceImpl.getInstance();

        // 在环境变量或本地 ~/.volc/config 文件中配置 AK 和 SK。
        // 详细说明请参考:https://www.volcengine.com/docs/4/65641
        // SDK 会自动从环境变量或配置文件中获取 AK 和 SK。
        // 测试时可使用下面两行代码,但请勿在项目代码中直接硬编码 AK 和 SK,以防泄漏。
        vodService.setAccessKey("your ak");
        vodService.setSecretKey("your sk");

        try {
            // 步骤 1: 调用 createSha1HlsDrmAuthToken 签发包含 DrmAuthToken 的 URL 查询字符串
            // DrmAuthToken 的有效期在此处设置,例如 3600 秒(1 小时)。
            String drmAuthToken = vodService.createSha1HlsDrmAuthToken(3600L);
            System.out.println("Generated Full Query String: " + drmAuthToken);

            // 步骤 2: 调用 GetHlsDecryptionKey 方法获取明文密钥
            com.volcengine.service.vod.model.request.VodGetHlsDecryptionKeyRequest.Builder reqBuilder = 
                    com.volcengine.service.vod.model.request.VodGetHlsDecryptionKeyRequest.newBuilder();
            
            /*
             * ============================== 重要提示 ==============================
             * createSha1HlsDrmAuthToken 方法返回的是一个完整的 URL 查询字符串,而不是单纯的 Token 值。
             * 例如:"X-Expires=...&DrmAuthToken=HMAC-SHA1%3A...&Action=..."
             *
             * 您需要从此字符串中解析出 "DrmAuthToken" 参数的值 (即 "HMAC-SHA1%3A..." 这部分),
             * 然后仅将这部分解析出的值传入下方的 setDrmAuthToken 方法。
             *
             * 以下代码为简化演示,直接传入了完整的字符串,这在实际运行时是错误的。
             * 实际使用时,请务必先对 drmAuthToken 进行解析。
             * =====================================================================
             */
            
            // 传入从上一步获取的字符串中解析出的 DrmAuthToken 值
            reqBuilder.setDrmAuthToken(drmAuthToken); // 应传入解析后的 Token,而非完整字符串
            
            // 传入密钥 ID。该 ID 可从 GetPlayInfo 接口返回的 PlayAuthId 中获取。
            reqBuilder.setAk("your Ak"); // 请替换为实际的密钥 ID
            
            // Source 参数为固定值 jarvis
            reqBuilder.setSource("jarvis");
                        
            com.volcengine.service.vod.model.response.VodGetHlsDecryptionKeyResponse resp = vodService.getHlsDecryptionKey(reqBuilder.build());
            if (resp.getResponseMetadata().hasError()) {
                System.out.println(resp.getResponseMetadata().getError());
                System.exit(-1);
            }
            System.out.println(resp);
        } catch (Exception e) {
            e.printStackTrace.
        }
    }
}

加密转码

  1. 视频点播控制台创建用于 HLS 标准加密的媒体处理模板。音频转码模板、视频转码模板和极致超清模板均支持 HLS 标准加密。您需开启 HLS 标准加密开关,并输入解密服务地址,如下图所示。
    Image

    说明

    媒体处理模板的其他参数配置请见以下文档:

  2. 视频点播控制台创建工作流。根据您创建的媒体处理模板类型勾选相应的工作流任务并关联开启了 HLS 标准加密的媒体处理模板。

  3. 调用 StartWorkflow 接口传入工作流 ID 触发标准加密转码。若您自行调用 CreateHlsDecryptionKey 方法创建加密密钥,则还需要通过 Input 参数指定 Kid(密钥 ID),示例如下:

    https://vod.volcengineapi.com?Action=StartWorkflow&Version=2020-08-01
    {
      "Vid": "v0d399g10001***aljhtddi6hgvn0",
      "TemplateId": "a378f66a5bc2495***5fc14ac109625f",
      "Input": "{\"OverrideParams\": {\"TranscodeVideo\": [{\"TemplateId\": [\"All\"],\"Encryption\": {\"Kid\":\"68637bee559c7a***99f8c500e9840a\"}}]}}"
    }
    
  4. 查看 HLS 标准加密转码结果。

    • 控制台方式
      1. 登录视频点播控制台,进入指定空间。
      2. 媒资管理 > 视频管理页面,单击目标视频操作列的详情按钮,进入视频详情页面。
      3. 单击视频地址页签。您可以查看该加密转码输出的流会标识标准加密字样。
    • 事件通知:配置工作流执行完成事件(工作流处理)或媒体处理任务执行完成事件(单模板处理)通知。视频点播服务会在任务执行完成时及时通知您。
      • 对于工作流执行完成事件,从接收到的回调结果中 TranscodeInfo 数组中的 StoreUri 参数获取到转码产物的存储地址。其中 TranscodeInfo.Encrypt 字段为 true 表示已加密。
      • 对于媒体处理任务执行完成事件,从接收到的回调结果中 Output.OutputTemplate 参数获取到转码产物的存储地址。其中 VideoTranscodeInfo.Encrypt 字段为 true 表示已加密。

配置 HLS 标准加密改写(推荐)

HLS 标准加密改写是指系统会在 M3U8 文件内 #EXT-X-KEY 标签后面增加加密参数(包括加密算法、密钥 URI 地址和鉴权参数)。客户端收到被改写的 M3U8 文件以后,将会使用带鉴权参数的密钥 URI 来请求密钥,从 CDN 节点获取到密钥以后将会使用对应的加密算法和密钥来解密 TS 文件。通过配置 HLS 标准加密改写功能,可以实现对 HLS 数据访问过程的加密保护。开启 HLS 标准加密改写的具体操作步骤,请见配置 HLS 标准加密改写

开启 HLS 标准加密改写后,客户端需携带 AppAuthToken 参数向 CDN 节点发起对 M3U8 文件的访问请求。您需要在获取到的 M3U8 文件 URL 尾部自行拼接 AppAuthToken=<token>

  • 原始 M3U8 文件 URL 示例https://demo.bytedance.com/index.m3u8
  • 输入到播放器 M3U8 文件 URL 示例https://demo.bytedance.com/index.m3u8?AppAuthToken=<token>

说明

AppAuthToken 需要您自行搭建令牌服务,颁发用户令牌(即生成 AppAuthToken)。AppAuthToken 为默认参数名。您也可以在视频点播控制台域名高级配置页签下自定义设置参数名。参数名大小写敏感,请确保您在视频点播控制台设置的参数名和客户端请求携带的参数名完全一致。

客户端解密播放

播放原理和整体流程

解密播放的整体流程如下图所示。核心在于客户端需要先获取到视频的 M3U8 播放地址,然后根据 M3U8 文件内的信息去获取解密密钥。
Image

  1. 请求播放
    1. 用户在应用客户端中点击播放按钮,客户端向您自己的业务后台发起一个播放请求。
    2. 应用服务端收到请求后,会进行业务逻辑判断,例如检查用户是否登录、该视频是否付费等。
    3. 如果验证通过,应用服务端调用视频点播服务的 API 来生成一个有时效性的播放凭证 PlayAuthToken,再将生成的 PlayAuthToken 返回给应用客户端。

    说明

    如果您使用 DirectUrl 模式播放(也就是直接将播放 URL 设置给播放器 SDK),那么应用服务端在完成业务逻辑判断后,可直接将视频播放地址(通过 GetPlayInfo 接口获取或自签算获得)返回给应用客户端。

  2. 获取播放信息和内容
    1. 客户端将上一步获取到的 PlayAuthToken 和 Vid 传递给集成的播放器 SDK。播放器 SDK 携带 PlayAuthToken 向视频点播服务发起请求,内部调用 GetPlayInfo 接口获取播放信息。
    2. 视频点播服务会返回该视频的详细信息,其中最重要的是播放地址 PlayUrl。这个地址通常是 M3U8 格式的,并且指向了 CDN 上的资源。
    3. 播放器 SDK 拿到 M3U8 文件的 CDN 地址后,向 CDN 发起请求。
    4. CDN 将 M3U8 文件返回给播放器SDK。这个 M3U8 文件里不仅包含了视频分片(TS 文件)的地址,还包含了一个获取解密密钥的地址(URI)
  3. 获取解密密钥:当播放器 SDK 准备播放加密的视频分片时,它必须先获取解密密钥。不同的密钥管理模式下,获取解密密钥的方式不同,详见搭建解密服务。示例:
    • 假设 M3U8 文件内容如下:

      #EXTM3U
      #EXT-X-VERSION:3
      #EXT-X-TARGETDURATION:10
      #EXT-X-KEY:METHOD=AES-128,URI="https://example.com/kds/api/v1/keys?source=jarvis&ak=685e86b66c******9723be88b010c03ab",IV=0x000000000000000000$99999999999999999,
      #EXTINF:10,
      segment1.ts
      #EXTINF:10,
      segment2.ts
      #EXT-X-ENDLIST
      
    • 客户端会解析 #EXT-X-KEY 标签中的 URI 属性,拼接出获取密钥的请求。客户端会向此 URL 发送请求。服务端收到请求后,会根据 ak 参数查找对应的解密密钥,并返回密钥信息。

  4. 解密与播放:播放器 SDK 获取到解密密钥,使用密钥对视频进行解密并播放。

获取播放信息

您既可以通过播放地址播放,也可以通过临时播放 Token 播放。与播放普通视频的关键不同在于,您的应用服务端在调用 GetPlayInfo 接口获取播放地址或签发 PlayAuthToken 时,必须将 FileType 参数设置为 standard_evideo(加密视频)或 standard_eaudio (加密音频),以确保获取到的是 HLS 标准加密视频的播放信息。

播放器集成

使用火山引擎播放器 SDK(推荐)

详见以下文档:

使用第三方播放器

若使用第三方播放器,您需要自行实现完整的密钥获取和解密逻辑。

  1. 获取播放地址: 从视频点播服务获取 M3U8 文件的播放地址。详情请参见获取播放地址
  2. 解析密钥 URI: 客户端下载 M3U8 文件,并从 #EXT-X-KEY 标签中解析出获取解密密钥的 URI。
  3. 请求解密密钥: 客户端向解析出的 URI 发起请求,获取解密密钥。
  4. 解密播放: 将获取到的密钥传递给播放器,用于解密视频流并播放。