用户的视频内容一旦被盗用,损失巨大,为此 VOD 实现了一套完善的版权保护方案,保障视频的播放安全。方案采用token模式,全面支撑 PC Web、ios、android 端。
在您的转码模板中设置token加密模式后,经过加密的媒资,就可以受到版权保护:
token 模式接入相对复杂,但安全性更高,可实现媒资粒度的高级版权保护。
两种模式支持的范围如下:
播放端 | 类型 | 是否支持token模式 |
---|---|---|
PC Web | 在线 | 是 |
ios | 在线 | 是 |
android | 在线 | 是 |
原理
token模式下,引入用户企业服务器的业务鉴权和带过期时间的token临时授权播放。PC端和APP端流程不同。
PC端接入
操作步骤:
视频加密配置有以下可选项:
- Open:开放密钥,系统自动生成加密密钥,密钥公开,不设访问控制。
- PlayerBinding:绑定播放器,系统自动生成加密密钥,密钥设有访问控制。 PlayerBinding模式下密钥设有访问控制,安全性比较高,推荐使用PlayerBinding模式。
- Token: 临时口令播放授权,系统根据userKey生成密钥加密视频;播放时按照规则生成Token并发送给密钥服务验证,校验通过才能播放,安全性比较高。
PC Web端播放时,企业APP或网站,设置m3u8播放地址,播放器解析到是token模式加密时,提醒用户将播放者的信息(userKey、jobId、session等等)发送请求给企业服务;
企业服务器首先校验该播放者是否有权限播放该视频(是否登录、是否购买课程等),如果通过校验则使用joId、userId、userKey、expirationtime按照计算规则生成token(参见下文token计算规则),并通过设置setToken方法发送给播放器;
播放器将token、视频密钥id信息发送到后端进行校验是否合法与超时,通过校验后,将该视频加密后发送给播放器(https协议);
播放器解密密钥后进行视频内容解密播放。
var player = cyberplayer('player-container').setup({ ... file: 'http://domain/name.m3u8', ak: '27add1b94dd5485d916cc866190be704' }); player.on('beforePlay', function (e) { if (!/m3u8/.test(e.file)) { return; } $.ajax('http://domain/getToken?file=' + e.file, function(e) { player.setToken(e.file, token); }); });
如果要同时设置多个视频的token(比如配置多个码率的视频时) ,参照下列方法:
player.setToken([
{
file: 'file1',
tokenText: 'token1'
},
{
file: 'file2',
tokenText: 'token2'
}
]);
iOS端接入
与PC web端的差别在于,iOS端token是在初始化播放器之前完成业务鉴权、生成的,并和m3u8播放地址一起初始化给播放器。
操作步骤:
iOS端在线方案接入,用户需要调用此接口:
- (void)setToken:(NSString*)token;
iOS端离线下载需要token认证的视频时,需要实现下面的回调接口:
-(void)task:(CyberDownloadTask*)task needAuthentication:(NSMutableDictionary*)parameters;
用户可以取得task中的信息,来判断这个任务是否需要相关鉴权信息。如果需要时,在parameters字段中设置正确的鉴权信息。
parameters 中可设置的字段包括:
字段 | 说明 |
---|---|
token | Token模式时,设置此字段 |
iOS端视频离线下载后,videoworks会使用手机设备特征标识信息对视频密钥再次进行加密,以保证即使视频被拷贝到别的手机设备上也无法播放。
Android端接入
Android端设置token模式的步骤与pc Web端一样。 Android端在线方案接入方法如下:
非加密视频的播放请参考播放器文档,加密视频与非加密视频的两个不同之处如下,
函数 | 参数 | 备注 |
---|---|---|
public void setVideoPath(String path, String token) | path 视频路径 token 加密口令 | 使用token加密时,用该方法设置视频路径 |
函数 | 参数 | 备注 |
---|---|---|
public static int getMediaInfo(Context ctx, String path, String token) | path 视频路径 token 加密口令 | 使用token加密时,用该方法启用多分辨率探测 |
注意:
多分辨率探测独立于视频播放。调用getMediaInfo方法之后,即可调用BVideoView.getSupportedResolution()
获得视频分辨率数组,详见demo代码。
Android端离线下载方案接入方法:
与非加密视频的相比,仅在开启下载时,调用的接口不同:VideoDownloadManager类
函数 | 参数 | 备注 |
---|---|---|
public void startOrResumeDownloaderWithToken(String url, String token, DownloadObserver observer) | url 视频路径 token 加密口令 observer 下载状态与进度监听器 | 使用token加密时,用该方法启用下载 |
Android端视频离线下载后,videoworks会使用手机设备特征标识信息对视频密钥再次进行加密,以保证即使视频被拷贝到别的手机设备上也无法播放。
名词解释:
token的生成方法:
HMAC-SHA-256加密算法 Sample Code
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import org.apache.commons.codec.binary.Hex;
public class Main {
static final Charset CHARSET_UTF8 = Charset.forName("UTF-8");
public static String sha256Hex(String signingKey, String stringToSign) {
try {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(signingKey.getBytes(CHARSET_UTF8), "HmacSHA256"));
return new String(Hex.encodeHex(mac.doFinal(stringToSign.getBytes(CHARSET_UTF8))));
} catch (Exception e) {
System.out.println(e.getMessage());
}
return null;
}
public static void main(String[] args) {
String gTestUserKey = "testUserKey";
String gTestjobId = "testjobId";
System.out.println(sha256Hex(gTestUserKey, "/" + gTestjobId + "/" + (System.currentTimeMillis
()/1000 + 3600))); //过期时间以秒为单位
}
}
userKey无法通过videoworks平台直接获取,需要进入音视频处理MCP平台获取。
获取jobId有两种方式
方式一:
在视频处理的媒资列表点击相应的媒资名称/ID。
点击实例列表。
鼠标移动至【转码】模块,点击任务ID。
复制获取jobID。
方式二:
通过工作流运行实例接口获取jobId VideoWorks工作流运行实例接口