本文提供iOS播放器进阶功能的使用示例,完整功能使用说明参见API说明。
播放
短视频列表播放
针对典型的短视频列表播放场景,iOS播放器SDK提供了完善的列表播放功能,结合预加载等机制大幅改善短视频的起播速度。长视频场景不建议使用该功能。
播放带透明度视频
功能简介
阿里云播放器SDK支持渲染Alpha通道,实现播放透明礼物的动态效果。在直播间等场景中,播放透明礼物动效且不会遮挡直播间内容,明显提升用户观看和互动体验。
使用限制
一体化SDK6.8.0及以后版本或播放器SDK6.9.0及以后版本支持透明渲染能力。
功能优势
使用带有透明度信息的MP4视频作为礼物特效可以提供更好的动效质量,较小的文件体积,更高的兼容性和更高的开发效率。这使得礼物特效能够更好地展示给用户,提升用户体验。
更好的动效质量:MP4视频可以保留原始的动效质量,包括细节和颜色等,相比于其他格式,如 APN 或IXD,MP4可以更准确地还原设计师创作的动效效果。
较小的文件体积:MP4视频文件相比于其他格式,如APNG或IXD,可以更有效地压缩文件体积,提升加载速度并降低网络带宽消耗。
更高的兼容性:MP4视频是一种通用的视频格式,在各种设备和浏览器中都得到广泛支持,支持在主流设备上播放和观看礼物特效。
更高的开发效率:使用MP4视频作为礼物特效的技术方案相对简单,不需要开发人员去研究和实现复杂的解析和渲染逻辑,开发人员可以专注于其他功能的实现,提高开发效率。
Metal渲染
iOS播放器SDK支持使用Metal框架进行视频渲染。
目前仅支持设置背景颜色、缩放模式和画中画功能。
配置项
/**
@brief 视频渲染类型,0 表示默认渲染器;1 表示混合渲染器。默认值0
*/
/****
@brief video renderType, 0 means default render; 1 means mixed render.
*/
@property(nonatomic, assign) int videoRenderType;
使用示例
AVPConfig *config = [self.player getConfig];
//使用metal渲染方式
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];
外挂字幕
iOS播放器SDK支持添加和切换外挂字幕,现已支持SRT、SSA、ASS、VTT这4种格式的字幕。示例如下:
创建显示字幕的View。
根据不同的字幕格式创建不同的View。
// 初始化自定义subTitleLabel UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame]; // 将字幕添加至自定义的superView,superView是用户自定义的界面存在的父视图 [superView addSubview:subTitleLabel];
设置字幕相关监听。
添加字幕。
[self.player addExtSubtitle:URL];
切换字幕。
[self.player selectExtSubtitle:trackIndexenable:YES];
纯音频播放
通过禁用视频播放,达到纯音频播放的效果。在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) {
//切换到软解
}
}
网络自适应切换视频清晰度
HLS的多码率自适应视频流可以在视频点播中经过视频打包转码模板组进行转码处理后生成,详细操作请参见点播多码率自适应配置。
经过视频点播转码生成的自适应流,如果使用Vid方式播放,则需要指定默认播放清晰度列表为
AUTO
,才会获取并播放自适应的视频流;否则将按照默认逻辑选择低清晰度的视频流进行播放,默认清晰度播放顺序请参见清晰度相关问题。以VidAuth播放方式为例,指定清晰度列表的示例如下:AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.definitions = @"AUTO";
iOS播放器SDK支持多码率自适应HLS、DASH视频流。在prepare
成功之后,通过getMediaInfo
可以获取到各个码流的信息,即TrackInfo
。示例如下:
AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;
在播放过程中,可以通过调用播放器的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
提供了设置缓存和延迟的控制接口。示例如下:
三个缓冲区时长的大小关系必须为:startBufferDuration ≤ highBufferDuration ≤ maxBufferDuration。
当最大缓冲区时长(mMaxBufferDuration)大于5分钟时,为防止因为缓冲区过大导致的内存异常,系统将默认按5分钟生效。当mMaxBufferDuration设置超过50000 ms(即50s)时,可以启用大缓存,来降低内存占用,进一步提高播放性能,如有需要,请参见大缓存。
设置HTTP Header
通过AVPConfig
方法,可以给播放器中的请求加上HTTP的header参数。示例如下:
画中画
画中画功能的环境要求:iOS系统版本为iOS 15及以后、iOS播放器SDK版本为5.4.9.0及以后。
5.5.2.0之前版本的iOS播放器SDK,画中画仅提供开启和关闭画中画的调用方法,以及进入后台展示画中画视框;从5.5.2.0版本开始支持从外部设置画中画代理,从而支持更加个性化的画中画功能开发。
如需画中画功能生效, 请确保手机设置中的画中画功能已开启(
)。
开启画中画
开启画中画功能后,当应用退到后台时,视频会以画中画的形式在小窗口继续播放;当应用切回到前台时,视频恢复成原来的播放形式继续播放。画中画通过setPictureInPictureEnable
开关控制,如果要开启画中画功能,需要在AVPEventPrepareDone
的状态下进行。开启画中画功能的示例如下:
当播放器调用stop
停止播放时,此时画中画视窗已不需要,需要先通过setPictureInPictureEnable
开关关闭画中画后,再调用stop
。
设置画中画代理
下述仅提供部分常用的画中画视窗和播放器视窗进行交互操作的代码示例,包含显示画中画的暂停、播放、快进、快退按钮以及重新播放的逻辑,具体代理方法请参考播放器SDK Demo中SDK文件夹中AliyunPlayer.framework的AliPlayerPictureInPictureDelegate.h
头文件的内容。
增加画中画代理回调监听。
[self.player setPictureinPictureDelegate:self];
实现代理配置。
增加全局变量,用于控制播放器的状态变更。
监听播放事件状态变更回调接口时,主动调用下述方法更新画中画控制器相关状态。
监听播放事件回调接口时,主动调用下述方法更新画中画控制器相关状态。
设置监听。
监听画中画即将启动回调
监听画中画准备停止回调
监听画中画停止前告诉代理恢复用户回调
监听设置画中画当前可播放视频的时间范围回调
监听设置画中画是否为暂停或播放状态回调
监听画中画点击快进或快退按钮回调,同步播放器状态
监听画中画点击暂停或播放按钮回调,需要执行的操作
RTS降级播放
在使用超低延时直播RTS地址播放的场景下,通过设置RTS的降级地址(如HLS地址或FLV地址),当RTS拉流失败时,会自动降级到该地址播放。
//设置降级源downgradeUrl
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:downgradeUrl];
//可选,配置config其他项
AVPConfig *config = [self.player getConfig];
//设置降级URL
[self.player enableDowngrade:urlSource config:config];
设置视频背景色
iOS播放器SDK支持设置播放器渲染的背景色。接口和用法说明如下:
接口示例
/**
@brief 设置视频的背景色
@param color the color
*/
/****
@brief Set video background color
@param color the color
*/
-(void) setVideoBackgroundColor:(UIColor *)color;
用法说明
//参数为8位16进制数据,8位数据两两为一组,按照顺序分别表示R(red) G(green) B(blue) A(alpha 透明度)
//例如0x00ff00ff,表示绿色
[aliPlayer setVideoBackgroundColor:0x00ff00ff]
vidAuth设置指定播放域名
通过vidAuth方式可以指定vid对应的域名等字段,支持的字段详情请参见GetPlayInfo请求参数。接口及用法说明如下:
接口示例
/**
@brief 使用vid+playauth方式播放。可参考:https://help.aliyun.com/document_detail/57294.html
@param source AVPVidAuthSource的输入类型
@see AVPVidAuthSource
*/
- (void)setAuthSource:(AVPVidAuthSource*)source;
用法说明
通过其中的VidPlayerConfigGenerator接口的addVidPlayerConfigByStringValue添加playDomain字段。
VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
//增加playDomain字段,可以添加的字段参考
//https://help.aliyun.com/zh/vod/developer-reference/api-vod-2017-03-21-getplayinfo?spm=a2c4g.11186623.0.0.2bec2e44eqeDgx#api-detail-35
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.xxx.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:
后台解码
播放器SDK自6.12.0版本开始支持后台解码能力,开启本功能后,当播放器在后台时,依然可以进行视频流的解码、播放以及回调。使用示例如下:
//值为1表示进行后台解码,值为0表示不进行后台解码,默认值为0
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];
性能
本地缓存
iOS播放器SDK提供了本地缓存的功能,能够让用户重复播放视频时,提高起播速度、提高seek速度、减少卡顿,也能达到节省流量的目的。
开启本地缓存
本地缓存功能默认关闭,如需使用,需要手动开启。通过AliPlayerGlobalSettings
中的enableLocalCache
控制。示例如下:
开启或关闭单个URL的本地缓存
如果想要针对单个URL关闭本地缓存功能,可以在player config
中设置。示例如下:
大缓存
通过设置数据的最大缓冲区时长可以在播放视频时通过缓存视频数据到内存中,从而提高播放性能和观看体验。当最大缓冲区时长设置过大时,会造成缓冲区对内存的消耗。通过启用大缓存,可以将视频数据缓存到文件中,从而降低内存的占用,进一步提高播放器性能。
当mMaxBufferDuration设置超过50000 ms时,通过开启本地缓存触发大缓存功能自动启用。操作流程如下:
开启全局本地缓存。
本地缓存功能默认关闭,如需使用,需要手动开启。通过
AliPlayerGlobalSettings
中的enableLocalCache
控制。代码示例请参见本地缓存中的开启本地缓存。开启URL的本地缓存。
代码示例请参见本地缓存中的开启或关闭单个URL的本地缓存。
预加载
iOS播放器SDK提供预加载功能,是对本地缓存功能的升级,通过设置视频缓存的内存占用大小,更能提升视频的起播速度。
预加载功能的使用限制如下:
目前支持MP4、MP3、FLV、HLS等单个媒体文件的加载。
仅支持UrlSource播放方式播放视频的预加载,暂不支持VidAuth、VidSts方式播放视频的预加载。
iOS播放器SDK默认提供预加载时网络资源自动调度能力,以减少预加载的网络请求对正在播放视频的网络请求的影响。自动调度的策略是:仅当正在播放的视频缓冲到达一定阈值后,才会允许预加载进行请求。若您需要自行控制预加载的实时请求,可以通过以下方法将此策略关闭:
[AliPlayerGlobalSettings enableNetworkBalance:false];
开启本地缓存功能,详细操作请参见本地缓存。
获取AliMediaLoader实例。
AliMediaLoader实例为单例,即无论获取多少次,创建的都是同一个实例。
[AliMediaLoader shareInstance];
配置AliMediaLoader。
可选:删除加载文件。
可按需删除加载文件,以节省空间。iOS播放器SDK不提供删除接口,需要在App删除加载目录下的文件。
动态预加载
动态预加载策略,支持集成方既可以控制当前正在播放视频的缓存,又可以控制预加载的个数和缓存,满足业务方对播放体验与成本开销之间取得平衡的诉求。
获取下载速度
获取当前播放视频的下载速度,在onCurrentDownloadSpeed回调中获取speed。示例如下:
- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed{
intspeed_=speed;
}
网络特性
HTTPDNS
HTTPDNS是通过DNS解析技术将域名解析请求发送到特定的HTTPDNS服务器,以获取更快、更稳定的域名解析结果,降低DNS劫持风险。
阿里云播放器SDK提供增强型HTTPDNS功能,专为阿里云CDN域名提供HTTPDNS服务,支持阿里云CDN网络精准调度、实时解析生效,有效提高网络性能。
播放器SDK从6.7.0版本开始支持增强型HTTPDNS。6.7.0~6.11.0版本播放器SDK,请先提交工单或联系阿里云商务经理申请开通;6.12.0及以后版本无需申请,默认开启。
增强型HTTPDNS使用示例
增强型HTTPDNS仅为阿里云CDN域名提供HTTPDNS服务,请确保您配置的域名为阿里云CDN域名且已完成域名配置可正常使用。视频点播中添加和配置CDN域名请参见添加加速域名。更多有关CDN域名的信息请参见阿里云CDN。
//打开增强型httpdns
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
//可选,增加httpdns预解析域名
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];
HTTP/2
iOS播放器SDK自5.5.0.0版本开始默认开启使用HTTP/2。
iOS播放器SDK支持使用HTTP/2协议,该协议通过多路复用,避免队头阻塞,以改善播放性能。示例如下:
[AliPlayerGlobalSettingssetUseHttp2:true];
HTTP预建连TCP
针对HTTP的视频播放请求(非HTTPS),通过提前建立TCP连接能够显著改善用户体验,降低网络连接耗时,确保播放的即时性与连续性,同时优化网络和系统资源的使用效率。使用方式如下:
// domain格式为host[:port],port可选,多个域名之间用分号(;)隔开
// 全局设置
// 全量接口每次设置后使用当前的字符串为准(多-新增,少-删除),字符串空为停止预建连
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];
视频下载
iOS播放器SDK提供了点播服务视频的下载功能,允许用户通过阿里云播放器将视频缓存至本地观看。同时,提供了普通下载和安全下载两种下载方式。
普通下载:下载后的视频数据未经过阿里云加密,用户可以用第三方播放器播放。
安全下载:下载后的视频数据经过阿里云加密。第三方播放器无法播放。仅支持使用阿里云的播放器进行播放。
使用说明
仅VidSts和VidAuth方式支持视频下载功能。
使用播放器的视频下载功能,需要在点播控制台开启并配置下载模式,详细操作请参见离线下载。
视频下载支持断点续传。
操作步骤
可选:配置安全下载的加密校验文件。仅安全下载需要配置,普通下载无需配置。
说明请确保配置的加密校验文件与App信息一致,否则会导致视频下载失败。
如果设置为安全下载方式,则需要将在点播控制台生成的密钥文件配置到播放器SDK中,用于视频下载和播放的解密验证,密钥文件的生成请参见开启安全下载。
建议在Application中配置一次即可,示例如下:
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];
创建并设置下载器。
示例如下:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];
设置监听事件。
下载器提供了多个事件监听。示例如下:
-(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 { //下载成功 }
准备下载源。
通过
prepare
方法准备下载源,支持VidSts和VidAuth两种方式。示例如下:VidSts
//创建VidSts AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.region = @"接入地域"; // 点播服务的接入地域,默认为cn-shanghai。 stsSource.vid = @"Vid信息"; // 视频ID(VideoId)。 stsSource.securityToken = @"<yourSecurityToken>"; // STS安全令牌,需要调用STS服务的AssumeRole接口生成。 stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // STS临时AK对的访问密钥,需要调用STS服务的AssumeRole接口生成。 stsSource.accessKeyId = @"<yourAccessKeyId>"; // STS临时AK对的访问密钥ID,需要调用STS服务的AssumeRole接口生成。 //准备下载源 [downloader prepareWithVid:stsSource];
VidAuth
//创建VidAuth AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"Vid信息"; // 视频ID(VideoId)。 authSource.playAuth = @"<yourPlayAuth>"; // 播放凭证,需要调用点播服务的GetVideoPlayAuth接口生成。 authSource.region = @"接入地域"; // 5.5.5.0及之后版本播放器SDK,本参数已弃用,无需设置region,播放器会自动解析region;5.5.5.0之前版本播放器SDK,本参数必选,点播服务的接入地域,默认为cn-shanghai。 //准备下载源 [downloader prepareWithVid:authSource];
准备成功后,选择下载项。
准备成功后,会回调
onPrepared
方法。返回的TrackInfo中会包含各视频流的清晰度等信息,请选择一个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端)。
异常处理
使用阿里云播放器播放视频发生异常时,可借助单点探查功能快速定位问题,详细内容,请参见单点追查。