本文提供iOS播放器进阶功能的使用示例。
播放
短视频列表播放
针对典型的短视频列表播放场景,iOS播放器SDK提供了完善的列表播放功能,结合预加载等机制大幅改善短视频的起播速度。长视频场景不建议使用该功能。
外挂字幕
iOS播放器SDK支持添加和切换外挂字幕,现已支持SRT、SSA、ASS3种格式。示例如下:
纯音频播放
通过禁用视频播放,达到纯音频播放的效果。在prepare之前配置PlayerConfig。
AVPConfig *config = [self.player getConfig];
config.disableVideo = YES;
[self.player setConfig:config];
软硬解切换
iOS播放器SDK提供了H.264、H.265的硬解码能力,同时提供了
enableHardwareDecoder
提供开关。默认开,并且在硬解初始化失败时,自动切换为软解,保证视频的正常播放。示例如下://开启硬解,默认开启
self.player.enableHardwareDecoder = YES;
如果从硬解自动切换为软解,将会通过
onPlayerEvent
回调,示例如下:-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
//切换到软解
}
}
网络自适应切换视频清晰度
iOS播放器SDK支持多码率自适应HLS、DASH视频流。在
prepare
成功之后,通过getMediaInfo
可以获取到各个码流的信息,即TrackInfo
。示例如下:AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;
说明 HLS、DASH视频流需要经过多码率视频转码模板组打包处理,可以在点播控制台的视频或字幕打包模板设置。
中配置生产对应的视频流,详细操作请参见在播放过程中,可以通过调用播放器的
selectTrack
方法切换播放的码流,取值为SELECT_AVPTRACK_TYPE_VIDEO_AUTO时,为多码率自适应。示例如下://多码率切换
[self.player selectTrack:track.trackIndex];
//多码率切换并自适应
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];
切换的结果会在
onTrackChanged
监听之后会回调。示例如下:- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
if (info.trackType == AVPTRACK_TYPE_VIDEO) {
// video changed
}
// etc
}
截图
iOS播放器SDK提供了对当前视频截图的功能,由
snapshot
接口实现。截取的是原始的数据,并转为bitmap
返回。回调接口为onCaptureScreen
。示例如下://截图回调
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// 处理截图
}
//截取当前播放的画面
aliyunVodPlayer.snapshot();
说明 截图是不包含界面的。
试看
iOS播放器SDK通过配合点播服务配置,可以实现试看功能,支持VidSts和VidAuth(视频点播推荐使用此方式)两种播放方式。如何配置和使用试看功能,请参见点播试看。
配置试看功能之后,通过
VidPlayerConfigGen
接口的setPreviewTime
方法设置播放器的试看时长。以VidSts播放方式为例,示例如下:AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20];//20秒试看
source.playConfig = [vp generatePlayerConfig];//设置给播放源
...
当设置试看的时长,通过iOS播放器SDK播放视频时,服务端将不会返回完整的视频内容,而是返回试看时间段的内容。说明 VidPlayerConfigGen支持设置服务端支持的请求参数。请参见请求参数说明。
设置Referer
iOS播放器SDK支持设置Referer,配合控制台的黑白名单Referer,可以控制访问权限,由
AVPConfig
方法设置请求Referer。iOS播放器SDK的设置示例如下://先获取配置
AVPConfig *config = [self.player getConfig];
//设置referer
config.referer = referer;
....//其他设置
//设置配置给播放器
[self.player setConfig:config];
设置UserAgent
iOS播放器SDK提供了
AVPConfig
用来设置请求UA。设置之后,播放器请求的过程中将会带上UA信息。示例如下://先获取配置
AVPConfig *config = [self.player getConfig];
//设置userAgent
config.userAgent = userAgent;
....//其他设置
//设置配置给播放器
[self.player setConfig:config];
配置网络重试时间和次数
支持设置iOS播放器SDK的网络超时的时间和重试次数,由
AVPConfig
方法实现。示例如下://先获取配置
AVPConfig *config = [self.player getConfig];
//设置网络超时时间,单位ms
config.networkTimeout = 5000;
//设置超时重试次数。每次重试间隔为networkTimeout。networkRetryCount=0则表示不重试,重试策略app决定,默认值为2
config.networkRetryCount = 2;
....//其他设置
//设置配置给播放器
[self.player setConfig:config];
说明
- 如果设置了networkRetryCount:如此时发生网络问题,导致出现loading后,那么将会重试networkRetryCount次,每次的间隔时间为networkTimeout。
- 如果重试多次之后,还是loading的状态,那么就会回调
onError
事件,此时AVPErrorModel.code为ERROR_LOADING_TIMEOUT。 - 如果networkRetryCount设置为0,当网络重试超时的时候,播放器就会回调onPlayerEvent,参数eventWithString为EVENT_PLAYER_NETWORK_RETRY。此时,可以调用播放器的
reload
方法进行重新加载网络,或者进行其他的处理。
配置缓存和延迟控制
对于播放器来说,缓存的控制非常重要。合理的配置可以有效的加快起播速度并减少卡顿。iOS播放器SDK通过
AVPConfig
提供了设置缓存和延迟的控制接口。示例如下://先获取配置
AVPConfig *config = [self.player getConfig];
//最大延迟。注意:直播有效。当延时比较大时,播放器SDK内部会追帧等,保证播放器的延时在这个范围内。
config.maxDelayTime = 5000;
// 最大缓冲区时长。单位ms。播放器每次最多加载这么长时间的缓冲数据。
config.maxBufferDuration = 50000;
//高缓冲时长。单位ms。当网络不好导致加载数据时,如果加载的缓冲时长到达这个值,结束加载状态。
config.highBufferDuration = 3000;
// 起播缓冲区时长。单位ms。这个时间设置越短,起播越快。也可能会导致播放之后很快就会进入加载状态。
config.startBufferDuration = 500;
//其他设置
//设置配置给播放器
[self.player setConfig:config];
注意 三个缓冲区时长的大小关系必须为:startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration。
设置HTTP Header
通过
AVPConfig
方法,可以给播放器中的请求加上HTTP的header参数。示例如下://先获取配置
AVPConfig *config = [self.player getConfig];
//定义header
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
//比如使用httpdns时,需要设置Host。
[httpHeaders addObject:@"Host:example.com"];
//设置header
config.httpHeaders = httpHeaders;
....//其他设置
//设置配置给播放器
[self.player setConfig:config];
性能
本地缓存
iOS播放器SDK提供了本地缓存(边播边缓存)的功能,能够让用户重复播放视频时,达到省流量的目的。只需在
prepare
之前给播放器配置AVPCacheConfig
即可实现此功能。示例如下:AVPCacheConfig *config = [[AVPCacheConfig alloc] init];
//开启缓存功能
config.enable = YES;
//能够缓存的单个文件最大时长。超过此长度则不缓存
config.maxDuration = 100;
//缓存目录的位置,需替换成app期望的路径
config.path = @"please use your cache path here";
//缓存目录的最大大小。超过此大小,将会删除最旧的缓存文件
config.maxSizeMB = 200;
//设置缓存配置给到播放器
[self.player setCacheConfig:config];
缓存成功之后,以下情况将会利用缓存文件(必须已经设置了
setCacheConfig
)
- 如果设置了循环播放,即
loop(YES)
,那么第二次播放的时候,将会自动播放缓存的文件。 - 缓存成功后,重新创建播放器,播放同样的资源,也会自动使用缓存文件。
说明 vid的缓存文件是通过vid等信息定位的,所以对于vid的缓存文件,将需要网络请求信息之后才能确定使用哪个缓存文件。
iOS播放器SDK提供了获取缓存文件路径的接口:
API接口 | 描述 | 参数 | 返回值 |
---|---|---|---|
(NSString *) getCacheFilePath:(NSString *)URL | 根据URL获取缓存的文件名。必须先调用setCacheConfig才能获取到。 | URL | 最终缓存的文件绝对路径。 |
(NSString *) getCacheFilePath:(NSString *)vid format:(NSString *)format definition:(NSString *)definition | 根据vid获取缓存的文件名。 |
|
最终缓存的文件绝对路径。 |
边播边缓存的使用有限制条件,具体如下:
- 对于UrlSource播放方式。如果是HLS(即M3U8)地址,将不会缓存。如果是其他支持的格式,则根据缓存配置进行缓存。
- 对于VidAuth、VidSts播放方式,将会根据缓存配置进行缓存。
- 播放器读取完全部的数据则视为缓存成功。如果在此之前,调用
stop
,或者出错onError
,则缓存将会失败。 - cache内的seek的操作不会影响缓存结果。cache外的seek会导致缓存失败。
- 如果视频源是加密的,此时如果加密文件与App信息不一致,将会缓存失败。
- cache的结果回调,会通过
onPlayerEventInfo
回调。
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_CACHE_SUCCESS) {
//缓存成功事件。
}else if (eventWithString == EVENT_PLAYER_CACHE_ERROR) {
//缓存失败事件。
}
}
预加载
iOS播放器SDK提供预加载功能,是对本地缓存(边播边缓存)功能的升级,通过设置视频缓存的内存占用大小,更能提升视频的起播速度。
预加载功能的使用说明如下所示:
- 目前支持MP4、MP3、FLV、HLS(单码率视频流)等单个媒体文件的加载。
- 仅支持UrlSource播放方式播放视频的预加载,暂不支持VidAuth、VidSts方式播放视频的预加载。
获取下载速度
指获取当前播放视频的下载速度,在onCurrentDownloadSpeed回调中获取speed。示例如下:
- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed {
int speed_ = speed;
}
网络特性
使用HTTP/2
iOS播放器支持使用HTTP/2协议,该协议通过多路复用,避免队头阻塞,以改善播放性能。示例如下:
[AliPlayerGlobalSettings setUseHttp2:true];
视频下载
iOS播放器SDK提供了点播服务视频的下载功能,能够通过VidSts和VidAuth下载点播服务上的视频。同时,下载的方式提供了安全下载和普通下载的模式(可登录点播控制台,选择
配置)。
- 普通下载:下载后的视频数据未经过阿里云加密,用户可以用第三方播放器播放。
- 安全下载:下载后的视频数据经过阿里云加密。第三方播放器无法播放。仅支持使用阿里云的播放器进行播放。
- 创建并设置下载器。
创建下载器。示例如下:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];
下载SDK支持私有加密的下载。为了保证安全性,需要配置一个加密校验文件到播放器。(建议在Application中配置一次即可)。示例如下:NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];
注意 如果是安全下载,并且加密校验文件与App信息不一致,会导致下载失败。 - 设置监听事件。
下载器提供了多个事件监听。示例如下:
-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { //准备下载项成功 } -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel { //下载出错 } -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { //下载进度百分比 } -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { //处理进度百分比 } -(void)onCompletion:(AliMediaDownloader *)downloader { //下载成功 }
- 准备下载源。
通过
preapre
方法准备下载源。下载源支持AVPVidStsSource和AVPVidAuthSource两种。以AVPVidStsSource举例,示例如下://创建VidSts AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.vid = source.vid;//视频vid stsSource.region = DEFAULT_SERVER.region;//接入区域 stsSource.securityToken = DEFAULT_SERVER.securityToken;//安全token stsSource.accessKeySecret = DEFAULT_SERVER.accessKeySecret;//临时akSecret stsSource.accessKeyId = DEFAULT_SERVER.accessKeyId;//临时akId //准备下载源 [downloader prepareWithVid:stsSource];
- 准备成功后选择下载项。
准备成功后,会回调
onPrepared
方法。选择某个Track进行下载:-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; //比如:下载第一个TrackInfo [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; }
- 更新下载源并开始下载。
为了防止VidSts和VidAuth过期,建议更新下载源的信息后开始下载。示例如下:
//更新下载源 [downloader updateWithVid:vidSource] //开始下载 [downloader start];
- 下载成功或失败后,释放下载器。
下载成功后,调用
destroy
释放下载器。[self.downloader destroy]; self.downloader = nil;
视频加密播放
点播视频支持HLS标准加密、阿里云私有加密和DRM加密,直播视频仅支持DRM加密。加密播放请参见播放加密视频。Native RTS播放
iOS播放器SDK集成Native RTS SDK实现Native端低延时直播功能,详情请参见阿里云播放器SDK集成Native RTS SDK实现说明(iOS端)。
异常处理
使用阿里云播放器播放视频发生异常时,可借助单点探查功能快速定位问题,详细内容,请参见单点探查。