Android视频开发进阶(part6-安卓的DRM,视频版权保
之前因为种种原因好久没有更新视频开发的文章了。今天刚刚从国内飞回来,趁着周末更新一下.不过关于DRM这块首先一般的开发者很少用到,而且DRM的开发需要前后台的密切合作,可以说后台的工作占了一大半,安卓前端这块DRM的API封装其实已经很到位了,只是因为接触的人少,所以文档并没有多么而已。所以这篇文章只是给大家过一遍概念,细节我就少讲一些。有具体的问题可以留言,
今天主要开始讲解一下安卓视频开发的DRM这个问题,DRM是英文Digital rights management的缩写,可以理解为版权保护。众所周知,视频或者音频的盗版问题是困扰发行商的一个大麻烦,因为盗版的横行会直接导致发行商利润的减少。那么像在PC端或者移动端的在线/离线多媒体内容的播放上,发行商又能怎么解决呢?
比如最近优酷很火的《白夜追凶》这种电视剧,
附上我超级喜欢的潘老师。。。vip的会员可以享受离线观看。假如说这种类型的文件没有进行版权保护,或者说加密,那么会员机制就会轻易作废.(我可以申请一个会员,然后把文件从SD卡中复制粘贴并且发送到网上)
所以一般来说,对这种premiere content(因为我们公司也是做电视剧,老板都这么叫,中文翻译应该可以说是付费内容???),都需要对当前文件,例如MP4文件的audio或者video track部分的内容进行加密,但是metadata部分不加密。只有在用户登录之后,进行身份验证了才传一个密钥用来对该视频进行解密。
那么问题来了
在安卓平台上的视频怎么做DRM的解析?
在回答这个问题之前我们先了解一下当前移动端的DRM的一些概念。
1.DRM platform
DRM 平台可以理解为DRM服务的提供商,它提供了一整套DRM的服务方案,从前端到后端,这里大家可以把这种服务理解为一套带引号的SDK,不同的提供商在服务器端和客户端会要求不同的数据传输格式。因平台而异,安卓的设备普遍拥有Widevine这个服务(在framework层),是近几年才被google收购的。
3.一般的DRM平台提供商的任务
我们这一部分来详细的了解一下DRM的平台提供商的任务(当然平台提供商并不是必需的,如果企业自己有能力做一整套解决方案那也ok,不过这整篇文章你也不用看了😁)。
以Widevine的后台为例,widevine自从被google收购之后就将其后台发展为类似云平台的PASS服务了,企业的后台可以购买Widevine的服务,服务提供加密的API组还有数据库容量,用来保存企业视频的license,即解密秘钥。至于身份验证啊等等功能就留给企业后台自己完成。以下示意图可以大概解释一下Widevine的DRM流程
也就是说,其实MediaPlayer播放视频的时候,是不需要传任何类似MediaCrypto之类的对象的,直接用DrmManagerClient进行相关操作,framework层会自动处理解密工作了。
下面附上伪代码:
public static final String WV_DRM_SERVER_KEY = "WVDRMServerKey";
public static final String WV_ASSET_URI_KEY = "WVAssetURIKey";
public static final String WV_DEVICE_ID_KEY = "WVDeviceIDKey";
public static final String WV_PORTAL_KEY = "WVPortalKey";
/**
调用该方法进行解密,执行成功就ok了
**/
public void acquireKey(){
DrmInfoRequest drmInfoRequest = createDrmInfoRequest(assetUrl, infoHolder.getDrmLisenceUrl());
DrmInfo drmInfo = mDrmManager.acquireDrmInfo(drmInfoRequest);
int rights = mDrmManager.acquireRights(drmInfoRequest);
}
/**
licenseServerUri 就是 对license server进行http通信的Url
**/
private DrmInfoRequest createDrmInfoRequest(String assetUri, String licenseServerUri) {
DrmInfoRequest rightsAcquisitionInfo;
rightsAcquisitionInfo = new DrmInfoRequest(DrmInfoRequest.TYPE_RIGHTS_ACQUISITION_INFO,
WIDEVINE_MIME_TYPE);
if (licenseServerUri != null) {
rightsAcquisitionInfo.put(WV_DRM_SERVER_KEY, licenseServerUri);
}
rightsAcquisitionInfo.put(WV_ASSET_URI_KEY, assetUri);
rightsAcquisitionInfo.put(WV_DEVICE_ID_KEY, mDeviceId);
rightsAcquisitionInfo.put(WV_PORTAL_KEY, PORTAL_NAME);
return rightsAcquisitionInfo;
}
所以说MediaPlayer的DRM处理更加简单暴力。。。。当然DrmManagerClient还有其他的一些操作,比如说callback的注册等等。。。
这期的文章就到这,因为Drm涉及到很多细节的处理,还有和后台沟通的问题,这里我只是大概介绍一下Drm的概念和不同类型的api的用法,就不详细展开我工作中具体遇到的麻烦了,有问题可以直接留言或者私信~
刚刚从国内回新就感冒了,这几天昏昏沉沉的。。。。要再点睡觉好好休息了。