iOS AVPlayer M3U8 加密播放

这几天一直做M3U8的加密播放,刚开始在各种文章中学习,探索,但都失败了。下面就我个人的理解来说明下。

HLS(HTTP Live Streaming)是Apple的动态码率自适应技术。主要用于PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。

(不加密的可以省略key文件)如果是不加密的m3u8文件,可以复制URL到Safari直接播放。如果用AVPlayer,可以用url获取AVPlayerItem的实例对象[AVPlayerItem playerItemWithURL:],然后就可以用AVPlayer播放了。(推荐一个封装好AVPlayer的github:https://github.com/zhengwenming/WMPlayer)

当然,我们现在关心的是加密的m3u8,以下内容为m3u8文件中的内容,省略了很多ts部分。

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-MEDIA-SEQUENCE:0

#EXT-X-ALLOW-CACHE:YES

#EXT-X-TARGETDURATION:20

#EXT-X-KEY:METHOD=AES-128,URI="http://www.2611dv.com/key/abbbb",IV=0xb8af47d08484ac1dff6d32a0a1b163ad

#EXTINF:10.080000,

teacher-0000.ts.enc

。。。。。。。。

(具体的字段信息请查阅)

其中,加密的m3u8文件中,一定会有#EXT-X-KEY:METHOD=AES-128,URI="http://www.2611dv.com/key/abbbb"这段内容。

我们关注的是URI所对应的地址。这个地址上存着key文件(文件内容为16位的字符)。

那么以我的理解方式来用时序图描述下(其中key文件的存储位置是可变的,也可以放在资源服务器上)。


iOS AVPlayer M3U8 加密播放_第1张图片

其中,SVR为app对应的业务服务器,RES为app所访问的资源服务器,红线由AVPlayer发起。

现在,我们所用的验证方式,是在HTTP的Header中添加用户信息来完成的,但AVPlayer中并没有提供这样的方法。

通过google得知,可用未开放的key来设置扩展header(已上架)。代码如下:

NSString*strInfo =@"36asdf8e0-6a51-4e86-a855-603675fsdd19c7;";

NSMutableDictionary* headers = [NSMutableDictionarydictionary];

[headerssetObject:strInfoforKey:@"ADDInfo"];

NSString*strHeaderKey = [NSString stringWithFormat:@"AVURLAsset%@Header%@Key",@"HTTP",@"Fields"];

AVURLAsset* asset = [AVURLAssetURLAssetWithURL:[NSURLURLWithString:self.URLString]options:@{strHeaderKey : headers}];

self.currentItem= [AVPlayerItem playerItemWithAsset:asset];

或者使用ijkPlayer。


(猜想,或者在key文件所对应的uri中,使用get方式拼接参数,来完成验证功能)

你可能感兴趣的:(iOS AVPlayer M3U8 加密播放)