三方DRM(Fairplay)加密播放-视频点播UrlSource/直播UrlSource播放说明 仅支持HLS协议的Fairplay方案。
可参见智能媒体服务国际站控制台的直播封装功能,该功能目前仅支持国际站。
经过DRM加密的视频通过UrlSource方式播放时,除了与播放普通视频配置一致外,还必须实现AVPDrmDelegate接口以获取Fairplay证书及视频密钥。
@interface SimplePlayerViewController()
@end
- (void)viewDidLoad {
self.player = [[AliPlayer alloc] init];
self.player.playerView = self.avpPlayerView.playerView;
self.player.drmDelegate = self;
if(当前URL是三方DRM视频){
[self.player setPreferPlayerName:@"AppleAVPlayer"];
}
//...
}
//AVPDrmDelegate.requestCert和requestKey的接口,结合三方DRM厂商的文档获取证书和密钥。
//以下以PallyCon DRM厂商获取证书和密钥的实现供参考,详情参考https://pallycon.com/docs/en/multidrm
#pragma mark AVPDrmDelegate
- (NSData *)requestCert:(AliPlayer *)player {
// 业务也可以提前把证书请求好缓存下来,此处只要返回缓存的证书即可,可降低起播耗时。
// 如果证书数据不对,播放器会onError并告知相关错误,也可关注控制台的报错了解更多信息。
//将SITE_ID替换成您自己的
const char* url = "https://license.pallycon.com/ri/fpsKeyManager.do?siteId=SITE_ID";
//按照DRM厂商要求,通过HTTP GET请求配置的Fairplay证书
//尽量避免占用该线程太长时间。
NSData* responseData = [self performAsyncHttpGet:url];
if (!responseData) {
//异常处理,此时播放器会onError并告知相关错误。
return nil;
}
//请求回来的数据需要base64 decode后再返回给播放器
NSString *base64String = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
return [self decodeBase64String:base64String];
}
- (NSData *)requestKey:(AliPlayer *)player data:(NSData *)data {
//按照DRM厂商要求,通过HTTP POST请求密钥信息
NSString *urlString = [NSString stringWithFormat:@"https://license-global.pallycon.com/ri/licenseManager.do"];
const char *url = [urlString UTF8String];
//将TOKEN_ID替换成您自己的
NSString *headerString = [NSString stringWithFormat:@"pallycon-customdata-v2: TOKEN_ID"];
const char* headers[] = {
[headerString UTF8String]
};
int headerCount = sizeof(headers) / sizeof(headers[0]);
//尽量避免占用该线程太长时间。
NSData* responseData = [self performAsyncHttpPost:url
headers:headers
headerCount:headerCount
data:data];
if (!responseData) {
//异常处理,此时播放器会onError并告知相关错误。
return nil;
}
//若您的token的的response_format设置为original,则直接返回response,否则还需要解析后返回
//具体参考:https://pallycon.com/docs/en/multidrm/license/license-token/#token-json
//不同厂商response的格式与结构差异巨大,请仔细检查,如果response无法被用来解密,播放器会onError告知相关错误。
return [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
}