# AliPlayer_iOS
# 功能使用
阿里云SDK提供了以下几大功能:
- 单个视频播放功能
- 视频列表播放功能
- 下载视频功能
- 缓存功能
功能具体介绍如下。
<a name="a10bc835"></a>
## 一. 播放功能
播放功能的基本流程如下:
创建播放器->设置事件监听->创建播放源->准备播放器->准备成功后开始播放->播放控制->释放播放器。
<a name="3f171af3"></a>
### 1.创建播放器
可以创建两种播放器:AliPlayer和AliListPlayer。<br />AliListPlayer比AliPlayer多了列表播放的功能,其余功能是一致的。使用方法如下:
```objectivec
self.player = [[AliPlayer alloc] init];
self.listPlayer = [[AliListPlayer alloc] init];
```
如果播放的视频是安全下载后的本地文件(即经过阿里云`加密转码`过后的),那么还需要设置一个加密校验信息(建议在Application中配置一次即可):
```objectivec
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"];
[AliPrivateService initKey:encrptyFilePath];
```
如果没有设置正确的校验文件,播放安全下载后的文件会报错:ERROR_DEMUXER_OPENSTREAM。
<a name="e787e787"></a>
### 2.设置播放器Delegate
播放器提供了Delegate回调,比如:onPlayerEvent,onError等事件。使用方法如下:
```
@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
self.player = [[AliPlayer alloc] init];
self.player.playerView = self.avpPlayerView.playerView;
self.player.delegate = self;
//...
}
/**
@brief 错误代理回调
@param player 播放器player指针
@param errorModel 播放器错误描述,参考AliVcPlayerErrorModel
*/
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
//提示错误,及stop播放
}
/**
@brief 播放器事件回调
@param player 播放器player指针
@param eventType 播放器事件类型,@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone: {
// 准备完成
}
break;
case AVPEventAutoPlayStart:
// 自动播放开始事件
break;
case AVPEventFirstRenderedStart:
// 首帧显示
break;
case AVPEventCompletion:
// 播放完成
break;
case AVPEventLoadingStart:
// 缓冲开始
break;
case AVPEventLoadingEnd:
// 缓冲完成
break;
case AVPEventSeekEnd:
// 跳转完成
break;
case AVPEventLoopingStart:
// 循环播放开始
break;
default:
break;
}
}
/**
@brief 视频当前播放位置回调
@param player 播放器player指针
@param position 视频当前播放位置
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// 更新进度条
}
/**
@brief 视频缓存位置回调
@param player 播放器player指针
@param position 视频当前缓存位置
*/
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// 更新缓冲进度
}
/**
@brief 获取track信息回调
@param player 播放器player指针
@param info track流信息数组 参考AVPTrackInfo
*/
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
// 获取多码率信息
}
/**
@brief 字幕显示回调
@param player 播放器player指针
@param index 字幕显示的索引号
@param subtitle 字幕显示的字符串
*/
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
// 获取字幕进行显示
}
/**
@brief 字幕隐藏回调
@param player 播放器player指针
@param index 字幕显示的索引号
*/
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
// 隐藏字幕
}
/**
@brief 获取截图回调
@param player 播放器player指针
@param image 图像
*/
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// 预览,保存截图
}
/**
@brief track切换完成回调
@param player 播放器player指针
@param info 切换后的信息 参考AVPTrackInfo
*/
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// 切换码率结果通知
}
//...
```
> 具体回调参数的详细说明,参看接口文档。
<a name="8930810a"></a>
### 3. 创建DataSource,准备播放
播放器支持4种播放源:AVPVidStsSource,AVPVidAuthSource,AVPVidMpsSource,AVPUrlSource。其中AVPUrlSource是直接的url播放,其余的三种是通过vid进行播放:AVPVidStsSource推荐点播用户使用;AVPVidAuthSource不建议使用;AVPVidMpsSource仅限MPS用户使用。
以VidSts举例,使用方式如下:
```objectivec
//创建VidSts
AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.region = self.接入区域;
source.vid = self.视频vid;
source.securityToken = self.安全token;
source.accessKeySecret = self.临时akSecret;
source.accessKeyId = self.临时akId;
//设置播放源
[self.player setStsSource:source];
//准备播放
[self.player prepare];
```
> MPS视频播放的流程与概念,[参考这里](https://help.aliyun.com/document_detail/53522.html)
> 通过播放凭证VidAuth播放的流程,[参考这里](https://help.aliyun.com/document_detail/57294.html)
> 接入区域Region的设置,参考 [点播中心和访问域名](https://help.aliyun.com/document_detail/98194.html)
<a name="9f5db615"></a>
### 4. 设置显示的view
如果源有画面,那么需要设置显示的view到播放器中,用来显示画面。
```objectivec
self.player.playerView = self.avpPlayerView.playerView;//用户显示的view
```
<a name="622f036c"></a>
### 5. 播放控制
用户自行创建播放器的播放控制按钮,在按钮事件里面实现播放器控制接口。基本控制功能有播放、停止、暂停、拖动(seek),其中Seek功能仅对点播有效,直播使用暂停功能时会使画面停留在当前画面,使用恢复后会开始播放当前画面。使用示例如下:
```objectivec
// 开始播放。
[self.player start];
//暂停播放
[self.player pause];
//停止播放
[self.player stop];
// 跳转到。目前只支持不精准。
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];
// 重置
[self.player reset];
//释放。释放后播放器将不可再被使用。
[self.player destroy];
self.player = nil;
```
<a name="86ac2811"></a>
### 6. 切换多码率
播放器SDK支持HLS多码率地址播放。在`prepare`成功之后,通过`getMediaInfo`可以获取到各个码流的信息,即`TrackInfo`。
```objectivec
AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;
```
在播放过程中,可以通过调用播放器的`selectTrack`方法切换播放的码流。
```objectivec
[self.player selectTrack:track.trackIndex];
```
切换的结果会在`onTrackChanged`回调:
```objectivec
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
if (info.trackType == AVPTRACK_TYPE_VIDEO) {
// video changed
}
// etc
}
```
<a name="8b93d7d5"></a>
### 7.自动播放
播放器SDK支持自动播放视频的设置。在`prepare`之前设置autoPlay。
```objectivec
self.player.autoPlay = YES;
```
设置自动播放之后,prepare成功之后,将会自动播放视频。但是注意:自动播放的时候将不会回调`AVPEventPrepareDone`回调,而会回调AVPEventAutoPlayStart回调。
```objectivec
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone: {
break;
case AVPEventAutoPlayStart:
break;
}
}
```
<a name="483cbf34"></a>
### 8.循环播放
播放器SDK提供了循环播放视频的功能。设置`loop`开启循环播放, 播放完成后,将会自动从头开始播放视频。
```objectivec
self.player.loop = YES;
```
同时循环开始的回调将会使用`AVPEventLoopingStart`中通知。
<a name="597b947d"></a>
### 9.画面旋转、填充、镜像操作
播放器SDK提供过了多种设置,可以对画面进行精确的控制。包括设置画面旋转模式,设置画面缩放模式,设置镜