本文提供iOS播放器基础功能的使用示例。

创建播放器

本节介绍如何用最简单的方式让iOS播放器SDK播放视频,按照播放方式的不同可以分为手动播放和自动播放。

  1. 创建播放器。
    创建AliPlayer播放器。
    //创建播放器
    self.player = [[AliPlayer alloc] init];
    //埋点日志上报功能默认开启,当traceId设置为DisableAnalytics时,则关闭埋点日志上报。当traceId设置为其他参数时,则开启埋点日志上报。
    //建议传递traceId,便于跟踪日志。traceId为设备或用户的唯一标识符,通常为imei或idfa。
    [play setTraceID:@"xxxxxx"];
    说明 创建播放器时,将用户或设备标识符透传至traceId参数,可便于后续播放异常时的快速定位问题,详细内容请参见单点探查
  2. 设置监听器。
    播放器支持设置多个监听器。
    • prepare必须设置,因为手动播放需要在prepare回调中调用start开始播放。
    • onPlayerEventonError较为重要,建议您设置。
    @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 {
        // 切换码率结果通知
    }
  3. 创建DataSource。
    • iOS播放器SDK支持5种点播播放方式,包括:UrlSource播放、VidAuth播放(视频点播用户推荐使用)、VidSts播放、VidMps播放、加密播放。
    • iOS播放器SDK支持2种直播播放方式,UrlSource播放和加密播放。
    说明
    • UrlSource是直接通过URL播放,其余的三种是通过Vid进行播放:VidSts和VidAuth(推荐)限点播用户使用;VidMps仅限媒体处理(MPS)用户使用。
    • 接入地域Region的设置,请参见点播地域标识
    • MPS视频播放的流程与概念,请参见视频播放

    点播视频播放

    使用UrlSource播放方式播放点播视频,需要将播放器的source属性设置为播放地址。播放地址可以是第三方点播地址或阿里云点播服务中的播放地址。阿里云播放地址可以调用获取音视频播放地址接口获取。建议您集成点播服务端SDK来获取音视频播放地址,免去自签名的麻烦。调用接口获取音视频播放地址的示例请参见开发者门户

    点播URLSource播放示例

    AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; //播放地址,可以是第三方点播地址,或阿里云点播服务中的播放地址。
    [self.player setUrlSource:urlSource]; 

    使用VidAuth播放方式播放点播视频,需要将播放器的vid属性设置为音视频ID,将playauth属性设置为音视频播放凭证。音视频ID可以在音视频上传完成后通过控制台(路径:媒资库 > 音/视频。)或服务端接口(SearchMedia)获取。音视频播放凭证可以调用获取音视频播放凭证接口获取。建议您集成点播服务端SDK来获取音视频播放凭证,免去自签名的麻烦。调用接口获取音视频播放凭证的示例请参见开发者门户

    推荐视频点播用户采用此播放方式。相比STS播放方式,PlayAuth播放方式在易用性和安全性上更有优势,对比详情请参见凭证方式与STS方式对比

    VidAuth播放示例

    AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
    authSource.vid = @"Vid信息";
    authSource.playAuth = @"playAuth信息"; // 播放凭证
    authSource.region = @"接入地域"; // 点播服务的接入地域,默认为cn-shanghai
    [self.player setAuthSource:authSource];

    使用VidSts播放方式播放点播视频是指用STS临时凭证而非点播音视频播放凭证播放。STS临时Token需要提前获取,获取方式请参见获取STS临时Token。播放时需要将播放器的securityToken属性设置为STS临时Token,同时设置为STS临时Token生成的临时AK对(accessKeyId和accessKeySecret)。

    VidSts播放示例

    AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
        source.region = self."region"; //接入地域
        source.vid = self."Vid"; //视频ID(VideoId)
        source.securityToken = self."<yourSecurityToken>"; //安全token
        source.accessKeySecret = self."<yourAccessKeySecret>"; //鉴权密钥
        source.accessKeyId = self."<yourAccessKeyId>"; //鉴权ID
         //设置播放源
        [self.player setStsSource:source]

    VidMps播放方式是播放器为媒体处理用户(MPS用户)提供的播放方式。VidMps播放需要提前获取以下信息:

    • vid:媒体处理系统中的媒资ID。
    • AcessKeyId和AccessKeySecret:随STS临时Token下发的临时AK对。
    • SecurityToken:STS临时Token。
    • domainRegion:媒体资源所在的地域。
    • authInfo:授权信息。

    获取MPS媒体相关信息请参见媒体处理视频播放

    VidMps播放示例

    AVPVidMpsSource *mpsSource = [[AVPVidMpsSource alloc] init];
    mpsSource.region = @"接入地域"; // 点播服务的接入地域,默认为cn-shanghai
    mpsSource.vid = @"媒体ID"; // 媒体ID,也是视频ID(VideoId)
    mpsSource.accId = @"<yourAccessKeyId>"; // 鉴权ID
    mpsSource.accSecret = @"<yourAccessKeySecret>"; // 鉴权密钥
    mpsSource.stsToken = @"<yourSecurityToken>"; // 安全token
    mpsSource.authInfo = @"认证信息"; // 设置认证信息
    mpsSource.playDomain = @"播放Domain信息"; // 设置播放Domain
    mpsSource.mtsHlsUriToken = @"HlsUriToken信息"; // 设置HlsUriToken
    [self.player setMpsSource:mpsSource];

    点播视频支持HLS标准加密、阿里云私有加密和DRM加密。加密播放请参见iOS播放器加密播放

    直播视频播放

    使用URL播放方式播放直播视频,需要将播放器的source属性设置为直播拉流地址。播放地址可以是第三方直播地址或阿里云直播服务中的拉流地址。阿里云直播拉流地址可以通过直播控制台的地址生成器生成。详情请参见地址生成器

    直播URL播放示例

    AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; //播放地址,可以是第三方直播地址,或阿里云直播服务中的拉流地址。
    [self.player setUrlSource:urlSource];

    直播DRM加密播放请参见iOS播放器加密播放

  4. 设置显示View。
    如果播放源有画面,那么需要设置显示的view到播放器中,用来显示画面。示例如下:
    self.player.playerView = self.avpPlayerView.playerView;//用户显示的view
  5. 可选:开启自动播放,默认为关闭状态。
    self.player.autoPlay = YES;
  6. 准备播放。
    调用[self.player prepare]开始读取并解析数据。
    [self.player prepare];
  7. 开始播放。
    通过调用start方法开始播放视频。若创建自动播放,数据解析完成后将开始自动播放视频。
    注意 自动播放的时候将不会回调AVPEventPrepareDone回调,而会回调AVPEventAutoPlayStart回调。
    [self.player start];

控制播放

iOS播放器SDK支持开始、暂停、从指定时间点播放等主流操作。

开始播放

开始播放视频,由start接口实现。示例如下:
 [self.player start];

从指定时间开始播放

跳转到某个时刻进行播放,由seekToTime接口实现。适用于用户拖拽进度条,或续播等需要从指定时间点开始播放的场景。示例如下:
//posotion为指定的时间,单位:毫秒,目前只支持不精准模式AVP_SEEKMODE_INACCURATE。
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];

暂停播放

暂停播放视频,由pause接口实现。示例如下:
[self.player pause];

停止播放

停止播放视频,由stop接口实现。示例如下:
[self.player stop];

设置显示模式

iOS播放器SDK支持填充、旋转、镜像等显示设置。

填充

支持设置宽高比适应、宽高比填充和拉伸填充这3种画面填充模式,由scalingMode接口实现。示例如下:
//设置宽高比适应(将按照视频宽高比等比缩小到view内部,不会有画面变形)
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
//设置宽高比填充(将按照视频宽高比等比放大,充满view,不会有画面变形)
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
//设置拉伸填充(如果视频宽高比例与view比例不一致,会导致画面变形)
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;

旋转

指画面按指定角度旋转,由rotateMode接口实现。示例如下:
//设置画面顺时针旋转0度
self.player.rotateMode = AVP_ROTATE_0;
//设置画面顺时针旋转90度
self.player.rotateMode = AVP_ROTATE_90;
//设置画面顺时针旋转180度
self.player.rotateMode = AVP_ROTATE_180;
//设置画面顺时针旋转270度
self.player.rotateMode = AVP_ROTATE_270;

镜像

支持水平镜像、垂直镜像和无镜像,由mirrorMode接口实现。示例如下:
//设置无镜像
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
//设置水平镜像
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
//设置垂直镜像
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;

获取播放信息

iOS播放器SDK支持获取当前的播放进度、播放时长和缓冲进度信息。

获取当前播放进度

指获取当前的播放时刻,需要在onCurrentPositionUpdate回调中获取position。示例如下:
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
//position为当前播放进度,单位为毫秒
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}

获取播放时长

指获取视频总时长。需要在视频加载完成以后才可以获取到,比如在 onPrepared 回调之后再获取。单位:毫秒。示例如下:
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventPrepareDone: {
            if (self.player.duration >= 0) {
               NSString *duration  = self.player.duration;
            }
        }
            break;
        default:
            break;
    }
}

获取缓冲进度

指获取视频当前的缓冲进度,需要在onBufferedPositionUpdate回调中获取position。示例如下:
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = position;
}

获取实时渲染帧率、音视频码率、网络下行码率

示例如下:
//获取当前渲染的帧率,数据类型为Float。
[self.player getOption:AVP_OPTION_RENDER_FPS]
//获取当前播放的视频码率,数据类型为Float,单位为bps。
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
//获取当前播放的音频码率,数据类型为Float,单位为bps。
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
//获取当前的网络下行码率,数据类型为Float,单位为bps。
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

监听播放状态

指监听播放器的状态,onPlayerStatusChanged回调参数为当前播放器状态。示例如下:
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
    switch (newStatus) {
        case AVPStatusIdle:{
            //  空转,闲时,静态
        }
   break;
        case AVPStatusInitialzed:{
            //  初始化完成
        }
   break;
        case AVPStatusPrepared:{
            //  准备完成
        }
   break;
        case AVPStatusStarted:{
            //  正在播放
        }
   break;
case AVPStatusPaused:{
            //  播放暂停
        }
   break;
case AVPStatusStopped:{
            //  播放停止
        }
   break;
case AVPStatusCompletion:{
            //  播放完成
        }
   break;
case AVPStatusError:{
            //  播放错误
        }
   break;
        default:
            break;
    }
}

设置音量

设置音量包括音量调节和静音设置。

音量调节

指调节音量大小,支持0~2倍,当音量大于1时,可能出现噪音,不推荐使用。由volume接口实现。设置后还可获取音量信息。示例如下:
//volume的值为0~2之间的实数。
self.player.volume = 1.0f;
//获取音量信息。
self.player.volume

静音设置

指将播放中的视频设置为静音状态,由muted接口实现。示例如下:
self.player.muted = YES;

倍速播放

iOS播放器SDK提供了倍速播放视频的功能,通过设置rate方法,能够以0.5倍~5倍速去播放视频。同时保持变声不变调。示例如下:
//设置倍速播放:支持0.5~5倍速的播放,通常按0.5的倍数来设置,例如0.5倍、1倍、1.5倍等
self.player.rate = 1.0f;

多清晰度设置

如果使用VID方式(VidAuth及VidSts)播放,无需额外设置。iOS播放器SDK会从点播服务获取清晰度列表。iOS播放器SDK支持获取和切换清晰度,UrlSource方式暂不支持此设置。

获取清晰度

当视频加载完成后,可以获取视频的清晰度。可以使用onTrackReady监听回调返回info信息,获取清晰度trackBitrate。

- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    for (int i=0; i<info.count; i++) {
        AVPTrackInfo* track = [info objectAtIndex:i];
        switch (track.trackType) {
            case AVPTRACK_TYPE_VIDEO: {
                int trackBitrate = track.trackBitrate;
            }
                break;
        }
    }
}

切换清晰度

切换清晰度通过selectTrack方法,传递对应TrackInfo的index即可。

[self.player selectTrack:index];

清晰度切换通知

清晰度切换完成回调onTrackChanged。

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
   // 切换完成
}

循环播放

iOS播放器SDK提供了循环播放视频的功能。调用loop开启循环播放,播放完成后,将会自动从头开始播放视频。示例如下:
self.player.loop = YES;
同时循环开始的回调将会使用AVPEventLoopingStart中通知。示例如下:
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventLoopingStart:
            break;
    }
}