更新时间:2019-09-17 17:21
1. 高级播放器:除了具备基础播放器的所有功能外,还提供播放视频的高级能力,如视频加密、安全下载、边播边下缓存、清晰度切换等功能,建议使用阿里视频云点播和直播业务的用户使用。
2. RAM和STS:RAM和STS是阿里云提供的权限管理系统。RAM主要的作用是控制账号系统的权限。通过使用RAM可以将在主账号的权限范围内创建子用户,给不同的子用户分配不同的权限从而达到授权管理的目的。STS是一个安全凭证(Token)的管理系统,用来授予临时的访问权限,这样就可以通过STS来完成对于临时用户的访问授权。详细参考STS介绍。
3. 临时AccessKeyId、AccessKeySecret和SecurityToken:开启RAM授权,并通过STS授权系统提供的OpenAPI或SDK获取的AccessKeyId、AccessKeySecret和SecurityToken,用于播放和下载请求。详见:STS SDK参考。
4. playAuth(推荐):视频播放的唯一凭证,每个播放凭证都绑定了用户的身份标识,不同用户的播放凭证不能互换,否则无法正常播放视频。另外,播放凭证是有时效性的(默认100秒)。
5. 防盗链:通过判断request请求头的refer是否来源于本站的方式来决定视频是否能被播放。(在点播或CDN控制台设置referer)具体设置方法查看防盗链设置。
6. 动态库:播放器SDK以动态库的方式提供链接,在iOS集成时需要注意将SDK在target-general-embedded binaries里面添加。
7.安全下载:安全下载是指将视频文件通过私钥进行二次加密,下载后在SDK内部完成视频解密,保障离线视频仅能通过唯一应用(安全下载中设定的bundleID或keystore)进行安全播放的一种下载方式。(限点播和MPS用户使用)
高级播放器拥除了拥有普通播放器的基本功能外,还提供了很多点播和直播的业务功能,配合点播服务和直播服务获取视频ID或播放地址,集成高级播放器SDK框架(需集成AliyunPlayerSDK.framework和AliyunVodPlayerSDK.framework),然后调用播放器的Vid+STS或URL播放接口即可播放视频或观看直播。
流程:用户App获取STS凭证 -> 服务端下发STS凭证 -> 用户上传视频并获取vid -> 服务端获取STS凭证 -> 将STS凭证下发给客户端 -> 完成视频播放。
注意:AppServer为用户App的服务端,需要用户使用服务端API或SDK自行开发。
流程:用户App获取上传凭证 -> 服务端下发上传凭证 -> 用户上传视频并获取vid -> 服务端获取播放凭证 -> 将播放凭证下发给客户端 -> 完成视频播放。
注意:AppServer为用户App的服务端,需要用户使用服务端API或SDK自行开发。
在点播控制台全局设置-下载设置里面设置为安全下载->填写应用的bundleID或keystore的SHA1->生成并下载加密私钥文件->在SDK内集成并调用setEncrptyFile/setSecretImagePath设置加密私钥文件路径,加密文件获取详见文档,流程图如下:
备注:用户使用安全下载后,必须从点播控制台下载秘钥文件并集成在SDK里面。这样下载的视频不论是否是加密流,在本地都会存储为加密视频。如果使用普通下载,则无论是否是加密流,在本地都会存储为非加密视频,可以用任意播放器观看。
点播使用vid+sts播放和下载的用户可以参考以下点播和下载接入指南及Demo演示,视频教程演示如下:
播放器SDK支持iOS8.0以上。
建议使用XCode8.0以上版本进行编译。
播放器SDK支持普通导入和Cocoapods两种导入方式,选择一种即可。
需要导入AliyunPlayerSDK.framework、AliyunVodPlayerSDK.framework、AliyunLanguageSource.bundle到工程中。
播放器SDK_3.4.2版本以上需要添加 AliThirdparty.framework 到工程中。
arm文件夹:release版本,用于应用发布。
arm&simulator文件夹:debug和release通用版本,用于模拟器和真机测试。
AliyunLanguageSource.bundle : 多语言库
AliyunPlayerSDK.framework : 基础播放器动态库
AliyunVodPlayerSDK.framework :高级播放器动态库
AliThirdparty.framework : ffmpeg(3.3.0)等第三方库
备注:AliThirdparty.framework:播放器SDK version_3.4.2版本开始使用.
项目目录结构,以Demo项目为例。
集成动态库
Build Phases目录结构
import
三、设置Build Settings → Build Options → Enable Bitcode为YES。
备注:Bitcode参数,播放器SDK_3.4.2及以后版本都设置为YES;播放器SDK_3.4.2之前版本设置为NO,不包含3.4.2版本。
pod 'AliyunPlayer_iOS/AliyunVodPlayerSDK'
执行pod install或者pod update后集成SDK到项目工程。
运行项目名.xcworkspace
文件打开工程
在需要使用播放器SDK的Controller里面引入#import <AliyunVodPlayerSDK/AliyunVodPlayerSDK.h>
在viewDidLoad
里面添加如下初始化方法:
//创建播放器对象,可以创建多个示例
AliyunVodPlayer *aliPlayer = [[AliyunVodPlayer alloc] init];
//设置播放器代理
aliPlayer.delegate = self;
//获取播放器视图
UIView *playerView = aliPlayer.playerView
playerView.frame = CGRectMake(0, 0, width, height);
//添加播放器视图到需要展示的界面上
[self.view addSubview:playerView];
在给播放器设置代理的Controller里面添加以下代理,具体示例代码如下
- (void)vodPlayer:(AliyunVodPlayer *)vodPlayer onEventCallback:(AliyunVodPlayerEvent)event{
//这里监控播放事件回调
//主要事件如下:
switch (event) {
case AliyunVodPlayerEventPrepareDone:
//播放准备完成时触发
break;
case AliyunVodPlayerEventPlay:
//暂停后恢复播放时触发
break;
case AliyunVodPlayerEventFirstFrame:
//播放视频首帧显示出来时触发
break;
case AliyunVodPlayerEventPause:
//视频暂停时触发
break;
case AliyunVodPlayerEventStop:
//主动使用stop接口时触发
break;
case AliyunVodPlayerEventFinish:
//视频正常播放完成时触发
break;
case AliyunVodPlayerEventBeginLoading:
//视频开始载入时触发
break;
case AliyunVodPlayerEventEndLoading:
//视频加载完成时触发
break;
case AliyunVodPlayerEventSeekDone:
//视频Seek完成时触发
break;
default:
break;
}
}
- (void)vodPlayer:(AliyunVodPlayer *)vodPlayer playBackErrorModel:(ALPlayerVideoErrorModel *)errorModel{
//播放出错时触发,通过errorModel可以查看错误码、错误信息、视频ID、视频地址和requestId。
}
- (void)vodPlayer:(AliyunVodPlayer*)vodPlayer willSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{
//将要切换清晰度时触发
}
- (void)vodPlayer:(AliyunVodPlayer *)vodPlayer didSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{
//清晰度切换完成后触发
}
- (void)vodPlayer:(AliyunVodPlayer*)vodPlayer failSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{
//清晰度切换失败触发
}
- (void)onCircleStartWithVodPlayer:(AliyunVodPlayer*)vodPlayer{
//开启循环播放功能,开始循环播放时接收此事件。
}
- (void)onTimeExpiredErrorWithVodPlayer:(AliyunVodPlayer *)vodPlayer{
//播放器鉴权数据过期回调,出现过期可重新prepare新的地址或进行UI上的错误提醒。
}
/*
*功能:播放过程中鉴权即将过期时提供的回调消息(过期前一分钟回调)
*参数:videoid:过期时播放的videoId
*参数:quality:过期时播放的清晰度,playauth播放方式和STS播放方式有效。
*参数:videoDefinition:过期时播放的清晰度,MPS播放方式时有效。
*备注:使用方法参考高级播放器-点播。
*/
- (void)vodPlayerPlaybackAddressExpiredWithVideoId:(NSString *)videoId quality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{
//鉴权有效期为2小时,在这个回调里面可以提前请求新的鉴权,stop上一次播放,prepare新的地址,seek到当前位置
}
在开始播放前,播放器必须先prepare,高级播放器一共提供四种播放方式,选择一种即可,示例如下:
//播放方式一:使用vid+STS方式播放(点播用户推荐使用)
[self.aliPlayer prepareWithVid:vid accessKeyId:accessKeyId accessKeySecret:accessKeySecret securityToken:securityToken];
//播放方式二:使用URL播放(直播用户推荐使用)
NSURL *fileUrl = [NSURL fileURLWithPath:@""];//本地视频,填写文件路径
NSURL *strUrl = [NSURL URLWithString:@""];//网络视频,填写网络url地址
NSURL *url = strUrl;
[self.aliPlayer prepareWithURL:url];
//播放方式三:使用vid+playAuth方式播放(V3.2.0之前版本使用,兼容老用户)
[self.aliPlayer prepareWithVid:vid playAuth:playAuth];
//播放四:MPS的vid播放方式(仅限MPS用户使用)
[self.aliPlayer prepareWithVid:vid accId:accessKeyId accSecret:accessKeySecret stsToken:stsToken authInfo:authInfo region:region playDomain:playDomain mtsHlsUriToken:mtsHlsUriToken];
MPS播放的参数说明详见:MPS播放说明。
用户自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、恢复、重播、Seek,其中Seek功能仅对点播有效,直播时使用pause功能画面会停留在当前,使用resume后会进入当前直播画面。具体示例如下:
//开始播放
[self.aliPlayer start];
//停止播放,在开始播放之后调用
[self.aliPlayer stop];
//暂停播放
[self.aliPlayer pause];
//恢复播放,在调用暂停播放之后调用
[self.aliPlayer resume];
//重播,播放上一次的url
[self.aliPlayer replay];
//跳转到指定时间点的视频画面,时间单位为秒;支持Cache内Seek
[self.aliPlayer seekToTime:2.5];
播放器在prepare成功之后可以设置清晰度,在清晰度切换的按钮事件中添加设置,用户可以自行开发根据网速情况选择当前清晰度,示例如下:
//设置清晰度为超清
self.aliPlayer.quality = AliyunVodPlayerVideoHD
播放的当前时间和播放时长在prepare成功之后可以获取。示例代码如下:
//获取播放的当前时间,单位为秒
NSTimeInterval currentTime = self.aliPlayer.currentTime
//获取视频的总时长,单位为秒
NSTimeInterval duration = self.aliPlayer.duration
//计算当前进度,可以把当前进度值设置给进度条在界面上显示
float progress = currentTime/duration
在播放器创建之后可调用倍数播放功能,在开始播放之前和之后都可以起作用,仅对点播有效。示例代码如下:
//倍数播放支持0.5~2倍的设置,支持音频变速不变调
self.aliPlayer.playSpeed = 1.5;
边播边下缓存功能是在视频被成功播放后,文件会缓存到本地,再次播放视频时会直接使用本地缓存文件,不再走网络请求。加密流视频缓存到本地进行加密处理,需要集成安全下载加密文件,详见本文5.18。
可设置下载路径、最大下载数据(单位:MB)、单一视频最大允许下载的时长(单位:秒)
//设置缓存目录路径
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [pathArray objectAtIndex:0];
//在创建播放器类,并在调用prepare方法之前设置。比如:maxSize设置500M时缓存文件超过500M后会优先覆盖最早缓存的文件。maxDuration设置为300秒时表示超过300秒的视频不会启用缓存功能。
[self.aliPlayer setPlayingCache:YES saveDir:docDir maxSize:500 maxDuration:300];
功能限制说明:1.缓存功能仅针对被完整播放的视频(seek后无效),主要用于短视频循环播放场景。2.需要在播放器prepare之前调用。
用户可以获取播放器的当前播放状态,可获取的状态有闲时、错误、准备完成、播放中、暂停中、已停止、播放完成和加载中。代码示例如下:
AliyunVodPlayerState *state = self.aliPlayer.playerState;
用户是否开启循环播放功能,default:NO;YES:播放器结束自动在次播放当前视频。
self.aliPlayer.circlePlay = YES;
获取当前播放器时间点播放图片,返回类型:UIImage。
UIImage*image = [self.aliPlayer snapshot];
设置渲染视图角度,可设置为0°,90°,180°和270°,默认为0°,角度按顺时针计算。
[self.aliPlayer setRenderRotate:renderRotate0];
设置渲染镜像,提供水平镜像和垂直镜像设置,默认为无镜像。
[self.aliPlayer setRenderMirrorMode:renderMirrorModeNone];
参考下图设置:Target-Capabilities-Background Modes 打开,选择Audio,AirPlay and Picture in Picture选项即可。
播放器还提供了自动播放、音量控制、静音、亮度调节、显示模式设置和获取媒体信息等接口。示例代码如下:
//设置自动播放,设置后调用prepare之后会自动开始播放,无需调start接口
[self.aliPlayer setAutoPlay:YES];
//设置播放器音量(系统音量),值为0~1.0
[self.aliPlayer setVolume:0.8];
//设置为静音
[self.aliPlayer setMuteMode:YES];
//设置亮度(系统亮度),值为0~1.0
[self.aliPlayer setBrightness:0.5];
//设置显示模式,可设置为fit方式填充或corp方式裁剪充满
[self.aliPlayer setDisplayMode:AliyunVodPlayerDisplayModeFit];
//获取媒体信息,在prepareDone的时候才可以获取,主要可获取信息有视频ID、视频标题、视频封面、视频总时长、当前视频清晰度、所有视频清晰度
AliyunVodPlayerVideo *mediaInfo = [self.playerView getAliyunMediaInfo]
备注:参考sdk demo中time-shift 文件夹,直播时移项目。
//设置时移播放地址。
[self.vodPlayer prepareWithLiveTimeUrl:[NSURL URLWithString:LIVE_URL]];
//设置时移地址,获取可时移段。
[self.vodPlayer setLiveTimeShiftUrl:currentLive];
//获取当前直播时间
NSTimeInterval liveTime = self.vodPlayer.liveTime;
//获取当前播放时间
NSTimeInterval currentPlayTime = self.vodPlayer.currentPlayTime;
//获取时移接口返回的时移数据,每60秒更新一次。
ALPlayerVideoTimeShiftModel *timeShiftModel = self.vodPlayer.timeShiftModel;
//seek 到播放某一时间点,单位秒
[self.vodPlayer seekToLiveTime:(int)[[NSDate date] timeIntervalSince1970]];
客户端发送视频播放器请求时带上referer信息。(同时支持地址和vid播放)
//设置referer
/*
流程:
1.控制台-防盗链-开启防盗链
2.添加黑白名单(黑名单:如果设置referer是被添加的域名,则不能访问,白名单:如果设置的referer被添加到白名单的域名才可以访问)
3.默认不选中允许空referer,如果允许空refer,则客户端不设置referer是可以访问的。如果设置了,但是错误的,则不能访问。
*/
[self.vodPlayer setReferer:@""];
视频云点播服务提供两种下载方式:普通下载和安全下载。普通下载即下载的视频存在本地为非加密视频可以任意传播(即使视频流是加密的,下载后也为普通视频,谨慎使用)。安全下载可确保下载的视频为加密视频,仅能通过在控制台下载加密文件时填写的bundleID或签名绑定的应用播放(需要保护视频版权的用户使用,限点播和MPS用户)。
加密文件获取参考 文档。
在需要使用下载功能的Controller里面引入#import <AliyunPlayerSDK/AliyunVodPlayerSDK.h>
,在viewDidLoad
里面添加:
//获取下载的单例对象,并设置代理
[[AliyunVodDownLoadManager shareManager] setDownloadDelegate:self];
根据需求在使用下载功能的Controller里面添加代理事件。
-(void) onUnFinished:(NSArray<AliyunDataSource*>*)mediaInfos{
//异常中断导致下载未完成,下次启动后会接收到此回调。
}
/*
功能:开始下载后收到回调,更新最新的playAuth。主要场景是开始多个下载时,等待下载的任务自动开始下载后,playAuth有可能已经过期了,需通过此回调更新
参数:返回当前数据
返回:使用代理方法,设置playauth来更新数据。
*/
-(NSString*)onGetPlayAuth:(NSString*)vid format:(NSString*)format quality:(AliyunVodPlayerVideoQuality)quality;
/*
功能:开始下载后收到回调,更新最新的stsData。主要场景是开始多个下载时,等待下载的任务自动开始下载后,stsData有可能已经过期了,需通过此回调更新
参数:返回当前数据
返回:使用代理方法,设置AliyunStsData来更新数据。
*/
- (AliyunStsData*)onGetAliyunStsData:(NSString *)videoID
format:(NSString*)format
quality:(AliyunVodPlayerVideoQuality)quality;
/*
功能:开始下载后收到回调,更新最新的MtsData。主要场景是开始多个下载时,等待下载的任务自动开始下载后,MtsData有可能已经过期了,需通过此回调更新
参数:返回当前数据
返回:使用代理方法,设置AliyunMtsData来更新数据。
*/
- (AliyunMtsData*)onGetAliyunMtsData:(NSString *)videoID
format:(NSString*)format
quality:(NSString *)quality;
-(void) onPrepare:(NSArray<AliyunDownloadMediaInfo*>*)mediaInfos{
//准备下载时回调
}
-(void) onStart:(AliyunDownloadMediaInfo*)mediaInfo{
//开始下载时回调
}
-(void) onProgress:(AliyunDownloadMediaInfo*)mediaInfo{
//下载过程中回调下载进度,通过mediaInfo.downloadProgress获取进度
}
-(void) onStop:(AliyunDownloadMediaInfo*)mediaInfo{
//使用stop结束下载时回调
}
-(void) onCompletion:(AliyunDownloadMediaInfo*)mediaInfo{
//下载完成时回调
}
-(void)onError:(AliyunDownloadMediaInfo*)mediaInfo code:(int)code msg:(NSString *)msg{
//错误回调,错误码和错误信息详见接口文档中的错误信息表
}
设置下载路径后,视频下载后存放在用户设置的目录下面。
//设置下载路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
[[AliyunVodDownLoadManager shareManager] setDownLoadPath:path];
//设置最大下载个数,最多允许同时开启4个下载
[[AliyunVodDownLoadManager shareManager] setMaxDownloadOperationCount:3];
使用安全下载的用户必须设置(在准备下载之前设置),普通下载可以不用设置。
//将下载的加密文件集成到自己的项目中,确保加密文件的路径正确
NSString *path = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"];
[[AliyunVodDownLoadManager shareManager] setEncrptyFile:path];
准备下载主要作用是得到当前需要下载的视频流,如果已经知道当前下载的视频流信息,可以直接使用开始下载。
AliyunDataSource* source = [[AliyunDataSource alloc] init];
source.vid = vid;
//临时ak数据封装在AliyunStsData对象中,需要初始化对象。
source.requestMethod= AliyunVodRequestMethodStsToken;//以下参数点播使用STS方式下载的用户使用
source.stsData = [[AliyunStsData alloc] init];
source.stsData.accessKeyId = accessKeyId;
source.stsData.accessKeySecret = accessKeySecret;
source.stsData.securityToken = securityToken;
//以下参数使用playAuth下载方式的用户使用
//source.playAuth = playAuth;
//临时ak数据封装在AliyunStsData对象中,需要初始化对象,mps下载用户使用。
source.vid = mtsVid; //mps 所需的视频vid。
source.mtsData = [[AliyunMtsData alloc] init];
source.mtsData.accessKeyId = mtsAccessKey;
source.mtsData.accessKeySecret = mtsAccessSecret;
source.mtsData.securityToken = mtsStstoken;
source.mtsData.authInfo = mtsAuthon;
source.mtsData.region = mtsRegion;
source.mtsData.mtsHlsUriToken = @"";
//设置下载的清晰度
source.quality = AliyunVodPlayerVideoHD;
//设置下载的视频格式,根据转码后的文件格式来选择,当前返回的格式优先级为m3u8>mp4>flv
source.format = @"m3u8";
//监听代理onPrepare,可以获取视频清晰度、长度、大小、格式等信息(异步接口)
[[AliyunVodDownLoadManager shareManager] prepareDownloadMedia:source];
开始下载和准备下载是相互独立的,配置需要下载的DataSource后便可以使用开始下载功能。
AliyunDataSource* source = [[AliyunDataSource alloc] init];
source.vid = vid;
//临时ak数据封装在AliyunStsData对象中,需要初始化对象。
source.requestMethod= AliyunVodRequestMethodStsToken;//以下参数使用STS方式下载的用户使用
source.stsData = [[AliyunStsData alloc] init];
source.stsData.accessKeyId = accessKeyId;
source.stsData.accessKeySecret = accessKeySecret;
source.stsData.securityToken = securityToken;
//以下方式使用playAuth下载方式的用户使用
//source.playAuth = playAuth;
//设置下载的清晰度
source.quality = AliyunVodPlayerVideoHD;
//设置下载的视频格式,根据转码后的文件格式来选择,当前返回的格式优先级为m3u8>mp4>flv
source.format = @"m3u8";
//监听代理onPrepare,可以获取视频清晰度、长度、大小、格式等信息(异步接口)
[[AliyunVodDownLoadManager shareManager] startDownloadMedia:source];
备注:可以将多个
AliyunDataSource
添加到数组,使用[[AliyunVodDownLoadManager shareManager] startDownloadMedias:sources];
进行多个下载。
//可以在开始下载的代理里面获取当前正在下载的AliyunDownloadMediaInfo(同步接口)
[[AliyunVodDownLoadManager shareManager] stopDownloadMedia:info];
备注:1.可以使用
[[AliyunVodDownLoadManager shareManager] stopDownloadMedias];
停止所有下载。2.可以将多个AliyunDownloadMediaInfo
添加到数组,使用[[AliyunVodDownLoadManager shareManager] stopDownloadMedias:infos];
停止多个下载对象。
//获取正在下载视频资源列表(包括等待下载列表)
NSArray *infos = [[AliyunVodDownLoadManager shareManager] downloadingdMedias];
//获取正在下载视频资源列表(不包括等待下载列表)
NSArray *currentInfos = [[AliyunVodDownLoadManager shareManager] currentDownloadingdMedias];
//获取所有的视频资源列表(包括停止的,正在下载的视频列表)
NSArray *allInfos = [[AliyunVodDownLoadManager shareManager] allMedias];
//清除所有下载的媒体资源。
[[AliyunVodDownLoadManager shareManager] clearAllMedias];
//清除指定下载的媒体资源,AliyunDownloadMediaInfo可以通过onCompletion的回调获取。
[[AliyunVodDownLoadManager shareManager] clearMedia:info];
备注:使用
clearAllMedias
或clearMedia
后会清除已经下载的本地视频文件。
更多请参功能和接口请参考 接口文档
AliyunPlayerMediaDemo-Swift
这个Target。
在文档使用中是否遇到以下问题
更多建议
匿名提交