文档主要分为两部分
l IOS对HLS DRM的支持情况
l 具体实现办法
IOS对HLS DRM的支持情况
HTTP流媒体直播允许从一个普通的web服务器发送live的或预先录好的音频和视频,到任何运行iOS 3.0或更高版本(包括iPad和苹果电视),或任何电脑和Safari 4.0或更高版本安装的设备,支持加密和身份验证,但不支持DRM。
客户端软件首先基于URL识别流获取索引文件。索引文件依次指定位置可用的媒体文件,解密密钥,和可用的任何交替流。为选中的流,客户端序列下载每个可用的媒体文件。每个文件包含一个连续的段的流。一旦它有足够的数据下载,客户端开始呈现给用户。
客户端负责抓取任何解密密钥,验证或呈现用户界面允许认证,并解密所需的媒体文件。这一过程持续进行直到客户遇到# EXT-X-ENDLIST标签的索引文件。如果没有# EXT-X-ENDLIST标签在场,索引文件的一部分进行广播。在正在进行的广播,客户端定期加载一个新版本的索引文件。客户寻找新媒体文件和加密密钥的更新索引并添加这些url到它的队列。
包含流片段的媒体文件可能是分开加密的,当加密了,引用出现在索引文件的相应密钥文件,以便客户端可以检索密钥用于解密。
当一个密钥文件中列出的索引文件、密钥文件包含一个密码钥匙,必须用于解密后续媒体文件中列出的索引文件。目前HTTP流媒体直播支持使用16字节的密钥的aes - 128加密。
苹果的流媒体分割器支持三种配置的加密:
1 第一种模式允许指定一个在本地存在的秘钥文件,这种模式分割器向索引文件插入已经存在的秘钥文件的URL,并且用这个密钥加密所有媒体文件。
2 第二种模式要求分割器产生一个保存在本地指定路径的随即的密钥且予以索引,所有媒体文件用这个随即产生的密钥加密。
3 第三种模式要求分割器每N个媒体片段产生一个新的随即密钥,并保存在贝蒂的指定位置且予以索引,所有媒体文件用这个随即产生的密钥加密。
针对不同配置的加密方式客户端的解决方案:
由于IOS的不开源性,针对加密方式的HLS,客户端通过调用系统播放器
MPMoviePlayerViewController* mp =[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURLURLWithString:URL]];
if (mp)
{
if ([mprespondsToSelector:@selector(setMovieSourceType:)])
{
mp.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
}
[self.navigationController presentViewController:mpanimated:YES completion:nil];
[[NSNotificationCenter defaultCenter] addObserver: selfselector: @selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object: nil];
}
会在内部实现对URL的跳转(如果存在跳转URL)直到获取到最终的M3U8文件并进行解析。
比如如下m3u8文件内容:
#EXT-X-TARGETDURATION:14
#EXT-X-MEDIA_SEQUENCE:0
#EXT-X-VERSION:3
#EXT-X-KEY:METHOD=AES-128,URI="http:// 192.168.0.124:8080/wkserver?drmid=4a02&t=VOD&data=AQABMAIAXIBwWQAAAAAAAIN4IAEBEkyAOgADRwAA7wQS3oN4AgkAAQPpX5erdnWwq9/tYPanUTN+exRdhNdthFDUUNaNJU/1euZnXYTXbYRQ1FDWjSVP9XrmZ63LZSQpxNCC",IV=0x0101010101010101
#EXTINF:11.0
loco_000000000000003d_000000_video.ts
#EXTINF:11.0
loco_000000000000003d_000001_video.ts
并根据如上m3u8解析情况自动向URI所提供的地址发起获取KEY的请求。(如上则为wkserver)。根据以上情况,在播放器获取KEY之前本地应先针对m3u8的具体信息获取相应的KEY,并使其能向本地发起请求,从而得到KEY进行媒体文件TS的解密进而进行播放。
具体实现步骤如下:
1 根据初始URL得到跳转URL (如果存在跳转)
2 通过1级的m3u8拼接出最终m3u8目标文件的URL并取出m3u8内容(由于在1级m3u8文件中针对不同带宽的m3u8使用同一密钥)
3 解析m3u8文件取出data、type部分并替换url部分的请求地址为localhost:8080,使其指向本地代理服务器。修改其request的内容为固定内容,使内部代理服务器能通用。若存在多个分段加密时,按顺序将DATA保存在队列中,并逐个修改。
通过以上修改得到的m3u8文件传给播放器进行播放动作,播放器会在最终播放时发起向本地8080端口的取KEY的请求。那么能够让播放器获取到KEY需要做到如下准备
1 取出该m3u8中所有段对应的key
该部分则交由DRM模块完成,通过DRM的API实现与DRM的通讯,根据DRM具体方案的不同,接口略有区别,可针对IOS做适配层。通过DRM得到KEY。
2 建立本地内部代理服务器
在APP启动之后启动本地服务并监听来自8080端口的请求。根据请求的顺序依次将得到的KEY发送。