加密视频播放实施方案一:Dash.js

处于数字时代的今天,个人和公司都越来越注重知识产权。对于视频来说,保护知识产权的方案有:加水印和视频加密等。本文从加密的角度介绍两种方案,第一篇文章介绍基于Dash(W3C提出的标准)的实施方案,第二篇文章介绍Apple公司提出的HLS方案。

本篇为第一篇,介绍基于Dash的具体实施方案。

首选,需要准备几个工具:

ffmpeg(https://www.ffmpeg.org/),很强大的视频处理工具,如果视频需要进行格式转换、压缩等需要用到这个工具。

bento4 工具包(https://www.bento4.com/downloads/),这个工具包提供了一系列加工视频的工具,我们将会用到这个工具包对视频进行处理,这些处理包括:加密、将视频转换为Dash格式的分片文件等。

Dash.js 视频播放js库(https://github.com/Dash-Industry-Forum/dash.js),我们一会儿将使用这个js库来播放加密后的视频。

然后,我们来了解一下视频从加密到播放的具体流程:

加密视频播放流程

了解了流程之后,我们就基于这个流程来一步一步的实现基于Dash的加密流视频播放。

首先,将一个非MP4格式的视频通过ffmpeg工具转换为MP4格式,最简单的用法是这样的:

由于我的视频本身就是MP4格式的,所以就没有进行转换。

第二步,用mp4fragment工具对视频进行预处理:

第三步,用mp4encrypt加密预处理之后的视频:

加密方式采用MPEG-CENC,音轨和视频轨道都采用相同的密钥进行加密,密钥为长度为32位的随机字符,初始向量随机(加密算法为AES-256),同时向视频的头部写入eme加密参数信息(播放器通过该参数来判断视频是否有加密)。

第四步,用mp4dash工具将加密后的视频切割为dash文件清单:

此时,视频文件就准备好了,但还不能正常播放,还需要搭建一个简易的授权服务器,简易的代码如下:

授权服务器服务端根据Key ID查询对应的密钥,并将密钥返回给客户端。

需要注意的是,密钥为byte数组,在工具中使用密钥时,可以将密钥转换为HEX方式(16进制的字符串),但在授权服务器中返回密钥时,需要将密钥转换为base64编码格式。

好了,到现在所有的准备工作都完成了。 接下来,来尝试一下播放这个视频,一段简易的html播放代码像下面这个样子(代码用到了dash.js):

播放器在播放的过程中会根据相关信息判断是否有加密,如果有加密则根据相关配置去获取授权,本例通过clearkey方式简单的返回了加密视频使用的密钥。如果需要更完善的解决方案可以查阅DRM(Digital Rights Management,数字版权保护系统)相关的资料。

一切就绪之后,运行这个页面就可以看到播放效果了。

总结:这是一个简易但是很容易就能理解的实施方案,在实际的应用中,授权这一部分根据现实情况可能会处理的更加复杂一些,但具体如何建设这一部分,就是八仙过海各显神通了。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180625G20PWE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券