直播云

  • DRM 私有数字版权保护

    最近更新时间:2018-07-02 15:55:05

    七牛 DRM 解决方案

    对于视频行业来说,盗版可能是互联网付费观看模式最大的敌人,如何保护视频内容,不让制片方投入的大量人力、资金化为乌有,一直都是视频行业亟待解决的问题。

    数字版权保护(Digital Rights Management,DRM),可以通过一定的安全算法/协议对视频进行加密保护,使得视频在未经授权的条件下即使被非法复制和分发后,也无法正常播放,从而有效地保护了视频资源,阻止了盗版行为。

    七牛提供了一套完备的 DRM 技术方案,可以帮助客户便捷、高效地完成数字版权内容的保护。

    1. 基本原理

    1.1 七牛 DRM 方案架构图

    Group 14

    1.2 流程说明

    • 第一步:客户将视频文件上传到七牛云存储
    • 第二步:客户的业务服务器,调用七牛的 DRM 加密 API
      • 七牛 DRM 加密 API 的输入:视频源文件的地址,密钥,其他附带转码参数
      • 七牛 DRM 加密 API 的输出:经过加密后的新的视频文件地址(HLS 格式)
    • 第三步:客户端申请播放 DRM 加密后的视频文件
      • 七牛播放器的输入:视频地址,密钥
      • 七牛播放器的输出:音视频播放

    注意:密钥是一串随机的 16 位的 ASCII 码,该密钥由客户的业务服务器自行生成和管理,七牛云不存储该密钥。

    1.3 技术方案

    • 使用标准的 AES-128 对视频内容进行加密
    • 支持单个文件级别的 DRM 加密
    • 提供 Android/iOS/Web/Windows 播放 SDK,协助完成对视频的解密播放

    2. 接入流程

    2.1 注册七牛账号,开通云存储服务

    注册地址:https://www.qiniu.com/

    2.2 新建存储空间(API 支持)

    2.2.1 通过七牛官网 Portal 界面操作

    step1

    2.2.2 通过 REST API 操作

    相关文档:https://developer.qiniu.com/kodo/api/1382/mkbucketv2

    2.3 上传视频到存储(API 支持)

    2.3.1 通过七牛官网 Portal 界面操作

    step4

    2.3.2 通过 REST API 操作

    相关文档:https://developer.qiniu.com/kodo/api/1312/upload

    2.4 调用 DRM 加密 API 对视频进行加密

    由于此过程较为复杂,下面专门用一个章节详细展开描述。

    3. DRM 加密 API

    3.1 概述

    七牛云存储内建了一个非常高效易用的数据处理框架,该框架可以对存储在七牛云上的文件执行一系列符合规范的 数据处理 操作,开发者可以在访问资源时制定执行一个或多个数据处理指令,以直接获取经过处理后的结果,其中,DRM 加密功能,也属于该数据处理框架的一个子功能。

    3.2 数据处理接口设计

    具体 参考:持久化数据处理

    3.2.1 请求报文

    POST /pfop/ HTTP/1.1
    Host: api.qiniu.com  
    Content-Type: application/x-www-form-urlencoded  
    Authorization: QBox <AccessToken>  
    
    bucket=<urlEncodedBucket>
    &key=<urlEncodedKey>
    &fops=<urlEncodedFops>
    &notifyURL=<urlEncodedPersistentNotifyUrl>
    &force=<Force>
    

    注意:要在 Authorization 头部的 <AccessToken> 前添加 QBox 和半角空格。

    3.2.2 参数说明

    头部名称 必填 说明
    Host 固定为 api.qiniu.com
    Content-Type 固定为 application/x-www-form-urlencoded
    Authorization 该参数应严格按照 管理凭证 格式进行填充,否则会返回 401 错误码,一个合法的 Authorization 值应类似于:QBox QNJi_bYJlmO5LeY08FfoNj9w_r7...
    参数名称 必填 是否需要 URL 编码 说明
    bucket 存储空间
    key 资源名
    fops 处理操作列表,具体含义请参见 persistentOps详解
    notifyURL 处理结果通知接收 URL,请参考 持久化处理结果通知
    force 强制执行数据处理,当服务端发现 fops 指定的数据处理结果已经存在,那就认为已经处理成功,避免重复处理浪费资源。加上本字段并设为 1,则可强制执行数据处理并覆盖原结果
    pipeline 为空则表示使用公用队列,处理速度比较慢,建议指定私有队列,转码的时候使用独立的计算资源

    正常情况下的响应报文:

    HTTP/1.1 200 OK
    Content-Type: application/json
    Content-Length: <length>
    
    {"persistentId": <persistentId>}
    

    处理完成后会向用户指定的 notifyURL 发送处理结果,用户也可以根据 persistentId 来主动查询。详情可以参考 状态通知和查询

    3.3 DRM 加密处理

    我们以一个示例来演示 DRM 加密步骤,假设 test.mp4 文件已经被上传到名为 examplebucket 存储空间,我们要该文件进行 DRM 加密。

    3.3.1 请求报文

    POST /pfop/ HTTP/1.1
    Host: api.qiniu.com  
    Content-Type: application/x-www-form-urlencoded  
    Authorization: QBox <AccessToken>  
    
    bucket=example
    &key=base64_urlsafe(test.mp4)
    &fops=base64_urlsafe(avthumb/m3u8/noDomain/1/vcodec/copy/acodec/copy/hlsKey/<HLSKey>/hlsKeyUrl/<HLSKeyURL>/hlsMethod/qiniu-protection-10|saveas/<destination>
    &notifyURL=base64_urlsafe(http://callback.example.com)
    |saveas/<destination>
    

    3.2.2 参数说明

    由于 DRM 需要对源视频进行 HLS 切片,因此需要调用 音视频切片 接口,以 avthumb/m3u8/ 开头,具体参数的含义见:音视频切片 ,与 DRM 相关的参数描述如下:

    • hlsKey/
      • 即为 DRM 加密所需的 16 字节密钥,需经过 base64_urlsafe 编码
    • hlsKeyUrl/
      • 保留字段,目前可以填入任意字符串,不可为空
    • hlsMethod/qiniu-protection-10
      • 触发 DRM 加密的字段,以 qiniu-protect- 开头,后面跟 10~20 之间的数字
    • saveas/
      • 处理完毕后的文件位置,SafeBase64(bucket:key),由存储空间和文件名经过 Base64 位编码生成的字符串,详情请见:处理结果另存

    4. 播放器

    4.1 概述

    经过七牛 DRM 加密后的视频,没有解密是无法播放器的,七牛提供了 Android/iOS/Windows/Web 版本的播放 SDK,提供了丰富的功能和简单易用的接口,方便用户完成 DRM 后的视频播放。

    4.2 播放器地址

    4.3 使用方法

    • Android 播放 SDK
    // 创建播放对象
    mVideoView = (PLVideoView) findViewById(R.id.VideoView);
    // 设置 DRM 密钥,16 个字节
    AVOptions options = new AVOptions();
    byte[] key = {xxx, xxx, xxx, xxx, xxx ……};
    options.setByteArray(AVOptions.KEY_DRM_KEY, key);
    mVideoView.setAVOptions(options);
    // 设置播放地址,开始播放
    mVideoView.setVideoPath(VideoURL);
    mVideoView.start();
    
    • iOS 播放 SDK
    PLPlayerOption *option = [PLPlayerOption defaultOption];
    Byte drmKey[] = {xxx, xxx, xxx, xxx, xxx ……};
    self.player.DRMKey = [[NSString alloc] initWithBytes:drmKey length:sizeof(drmKey) encoding:NSUTF8StringEncoding];
    self.player = [PLPlayer playerWithURL:self.URL option:option];
    self.player.delegate = self;
    self.player.delegateQueue = dispatch_get_main_queue();
    self.player.backgroundPlayEnable = enableBackgroundPlay;
    [self.player play];
    
    • Windows 播放 SDK
    //创建播放对象
    QCM_Player g_player;
    qcCreatePlayer(&g_player, videoWnd);
    //设置播放窗口
    g_player.SetView(g_player.hPlayer, videoWnd->GetWnd (), NULL);
    //设置播放回调接口
    g_player.SetNotify(g_player.hPlayer, NotifyEvent, pUserData);
    //设置 DRM 秘钥,16 个字节
    unsigned char aKey[16] = {xxx, xxx, xxx, ...};
    g_player.SetParam(g_player.hPlayer, QC_PARSER_SET_QINIU_DRM_INFO, aKey);
    //开始播放
    g_player.Open(g_player.hPlayer, szFile, 0);
    //停止播放
    g_player.Stop(g_player.hPlayer);
    //关闭播放器
    g_player.Close(g_player.hPlayer);
    //释放播放对象
    qcDestroyPlayer(&g_player);
    
    • Web 播放 SDK

    Web 播放 SDK v0.3.8 及以上支持 DRM 功能,点此下载

    <link rel="stylesheet" href="http://p5bmfap1e.bkt.clouddn.com/qiniuplayer_0.3.8.min.css">
    <script src="http://p5bmfap1e.bkt.clouddn.com/qiniuplayer_0.3.8.min.js"></script>
    
    new QiniuPlayer('demo-video', {
          engineOrder : ['flash', 'html5'],
          autoplay    : true,
          preload     : 'auto',
          controls    : true,
          poster      : 'https://player.qiniucc.com/qiniu-620x205.png',
          url          : 'http://oaccf377t.bkt.clouddn.com/15Mj5w5-TpIwSHM8eatxYBpXTeA=/ll0KCPYvzIpDqLU_QSmmXBmRofrd.m3u8',
          DRMKey      : [0x6b,0x64,0x6e,0x6c,0x6a,0x6a,0x6c,0x63,0x6e,0x32,0x69,0x75,0x32,0x33,0x38,0x34],
           type          : 'hls'
    });
    

    5. 测试文件

    {0x6b,0x64,0x6e,0x6c,0x6a,0x6a,0x6c,0x63,0x6e,0x32,0x69,0x75,0x32,0x33,0x38,0x34};
    

    6. FAQ

    6.1 七牛的 DRM 支持的视频源格式有哪些 ?

    所有常见的视频格式都支持,如:mp4,mov,flv,avi 等等,详情请见:视频支持格式

    6.2 七牛的 DRM 加密后的视频,是否只有七牛的播放器才能解密播放 ?

    七牛的 DRM 加密采用的是标准的 AES-128 算法,支持标准 AES-128 算法解密的播放器均可播放

    6.3 七牛的服务端 REST API 是否有各种后端语言版本的 SDK ?

    有的,详情请见:七牛官方SDK

    以上内容是否对您有帮助?
  • Close