本文主要介绍如何在 iOS 端播放 HLS 私有加密视频。
前置步骤
iOS 端播放指引
注意:
配置支持 HTTP 请求,需要在项目的 info.plist 文件中添加 App Transport Security Settings->Allow Arbitrary Loads设置为 YES。
iOS 端使用 CIPlayerAssistor SDK 中封装好的 CIPlayerAssistor 和 CIMediaConfig 对象来播放 m3u8 文件,用户按照如下规则传入参数,即可实现播放功能。
1. 集成 CIPlayerAssistor SDK
podfile 文件中新增:
pod 'CIPlayerAssistor', :git => 'https://github.com/tencentyun/CIPlayerAssistor_iOS.git'
执行
pod install
即可。导入头文件:
#import <CIPlayerAssistor/CIPlayerAssistor.h>
2. 构造 CIMediaConfig 对象,参数说明如下:
参数名 | 说明 | 是否必填 | 类型 | 默认值 |
fileUrl | 请求m3u8接口的文件地址 | 是 | NSString | 无 |
CIPlayerAssistor 参数说明如下:
参数名 | 说明 | 是否必填 | 类型 | 默认值 |
config | 媒体文件配置信息 | 是 | CIMediaConfig | 无 |
token | token | 是 | NSString | 无 |
signature | 授权签名信息 | 是 | NSString | 无 |
3. iOS 端完整示例代码。
@property (strong, nonatomic)AVPlayer *myPlayer;//播放器@property (strong, nonatomic)AVPlayerItem *item;//播放单元@property (strong, nonatomic)AVPlayerLayer *playerLayer;//播放界面(layer)// 创建媒体配置对象// fileUrl:文件链接。CIMediaConfig * config = [[CIMediaConfig alloc]initWithFileUrl:@"https://ci-h5-bj-1258125638.cos.ap-beijing.myqcloud.com/hls/BigBuckBunny.m3u8?ci-process=pm3u8"];// CIMediaConfig 类在实例化时 自动生成了公钥 config.publicKey,可用于请求token;[self getToken:config.publicKey fileURL:config.fileUrl protectContentKey:1 callBack:^(NSString * _Nonnull token, NSString * _Nonnull signature) {dispatch_async(dispatch_get_main_queue(), ^{// 设置授权信息,会在url上通过&拼接传入的signature// 如果原始url是cdn的话,不用传cos的signature[[CIPlayerAssistor singleAssistor] buildPlayerUrlWithConfig:config withToken:token withSignature:signature buildUrlcallBack:^(NSString * _Nullable url, NSError * _Nullable error) {AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:url]];self.myPlayer = [AVPlayer playerWithPlayerItem:item];self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.myPlayer];self.playerLayer.frame = CGRectMake(0, 100, self.view.bounds.size.width, 300);[self.view.layer addSublayer:self.playerLayer];[self.myPlayer play];}];});}];- (void)getToken:(NSString *)publickey fileURL:(NSString *)fileURL protectContentKey:(int)protect callBack:(void (^)(NSString * token ,NSString * signature))callBack{// 该url仅为示例,请替换成您业务的url,具体实现请参考 “业务后端示例代码”NSMutableURLRequest * mrequest = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"https://cos.cloud.tencent.com/samples/hls/token"]];mrequest.HTTPMethod = @"POST";[mrequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];NSData *data = [publickey dataUsingEncoding:NSUTF8StringEncoding];publickey = [data base64EncodedStringWithOptions:0];NSDictionary * body = @{@"src":fileURL,@"publicKey":publickey,@"protectContentKey":@(protect)};mrequest.HTTPBody = [NSJSONSerialization dataWithJSONObject:body options:NSJSONWritingFragmentsAllowed error:nil];[[[NSURLSession sharedSession]dataTaskWithRequest:mrequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {NSDictionary * result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];callBack(result[@"token"],result[@"authorization"]);}]resume];}
Demo 体验