iOS端实现RTS拉流

通过阅读本文,您可以了解iOS端阿里云播放器SDK实现超低延时直播的方法。

前提条件

环境中已安装CocoaPods。

SDK集成

使用pod方式添加阿里云播放器SDK的依赖文件。

  1. 打开终端窗口。

  2. 进入项目所在路径,创建Podfile文件。

    pod init

  3. 编辑Podfile文件,添加最新版本的依赖。

    //播放器主库,请尽量使用最新版
    pod 'AliPlayerSDK_iOS', '6.19.0'
    //Rts胶水层库,版本号数字与播放器主库需保持一致
    pod 'AliPlayerSDK_iOS_ARTC', '6.19.0'
    //RtsSDK组件,独立版本号,最新是2.6.3
    pod 'RtsSDK', '2.6.3'
    说明
    • 播放器版本请参考SDK下载,建议使用最新版本。

    • 此处Pod依赖的版本仅供参考。获取最新的版本,阿里云播放器SDK请参见iOS播放器SDK超低延时直播SDK请参见SDK下载

  4. 安装SDK。执行之后,会生成*.xcworkspace文件,表示SDK集成完毕。

    pod install

阿里云播放器SDK接口使用

调用阿里云播放器SDK接口实现超低延时直播功能。更多阿里云播放器SDK功能,请参见进阶功能API说明

说明
  • 以下为示例代码。详细代码请参见开源项目

  • 基于阿里云播放器实现RTS拉流时,不能调用pause暂停直播流。您可以先调用stop停止播放,再调用prepare重新播放。

  • 不支持seek(拖动)。

创建播放器

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

  1. 创建播放器。

    创建AliPlayer播放器。

    说明

    播放器提供的播放质量监控(可查看播放器整体播放质量相关数据)、单点追查(可定位到具体的用户或设备,分析其播放行为,快速定位播放异常等问题)及视频播放统计功能都依赖埋点日志上报功能而实现。

    在创建播放器时,根据setTraceId参数的设置不同,其后续可实现的功能不同,具体如下:

    • setTraceId参数不传(默认):埋点日志上报功能开启,后续可以使用播放质量监控和视频播放统计功能,无法使用单点追查功能。

    • setTraceId参数传入traceid:traceid的值由您自行定义,需为您的用户或用户设备的唯一标识符,例如传入您业务的userid或者IMEI、IDFA等您业务用户的设备ID。传入traceid后,埋点日志上报功能开启,后续可以使用播放质量监控、单点追查和视频播放统计功能。

    • setTraceId参数设置为DisableAnalytics:关闭埋点日志上报,后续无法使用播放质量监控、单点追查和视频播放统计功能。

    // 创建播放器
    self.player = [[AliPlayer alloc] init];
    // 建议传入traceId
    [play setTraceID:@"xxxxxx"];
  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*)playereventType:(AVPEventType)eventType{
        switch(eventType){
            caseAVPEventPrepareDone:{
                // 准备完成
                // 在player设置autoPlay为NO时,建议在准备完成回调中手动调用start。
                [self.playerstart];
            }
                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。

    播放器支持4种播放源:VidSts、VidAuth、VidMps和UrlSource。其中UrlSource是直接URL播放,需要将URL设置为artc://协议,才可以使用RTS服务。

    AVPUrlSource *urlSource = [[AVPUrlSource alloc] 
    urlWithString:"artc://<播流地址>"]; 
    [self.player setUrlSource:urlSource];
  4. 设置显示View。

    如果播放源有画面,那么需要设置显示的view到播放器中,用来显示画面。示例如下:

    self.player.playerView = self.avpPlayerView.playerView;// 用户显示的view
  5. 播放参数配置

    配置播放参数,提升超低延时直播效果。

    说明

    6.3.0版本以及之后的播放器SDK均支持自动低延时最佳配置,当播放url为“artc://”开头,且客户没有手工修改过AVPConfigMaxDelayTimeHighBufferDurationStartBufferDuration值时,SDK会自动分别使用1000、10、10值进行实际的播放。

    若想自定义控制,请参考如下示例:

    //1. 获取并修改配置
    AVPConfig *config = self.aliPlayer.getConfig;
    
    if ([playUrl hasPrefix:@"artc://"]) {
        //最大延时为1秒
        [config setMaxDelayTime:1000];
        //起播缓存时长
        [config setStartBufferDuration:10];
        //卡顿恢复缓存时长
        [config setHighBufferDuration:10];
    } else {
        //config使用默认配置或自定义为其他配置
    }
    
    //2. 应用配置
    [_aliPlayer setConfig:config];
    
  6. 可选:开启自动播放,默认为关闭状态。

    self.player.autoPlay = YES;
  7. 准备播放

    调用[self.player prepare]开始读取并解析数据。

    [self.player prepare];
  8. 开始播放

    • 如果未开启自动播放,需要在AVPEventPrepareDone回调发生之后,择机调用start开始播放视频。

    • 如果开启了自动播放,则不需要调用start,数据解析完成后将开始自动播放视频。

    重要

    自动播放的时候将不会回调AVPEventPrepareDone回调,而会回调AVPEventAutoPlayStart回调。

    [self.player start];

控制播放

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

  1. 开始播放

开始播放视频,由start接口实现。示例如下:

 [self.player start];
  1. 停止播放

停止播放视频,由stop接口实现。示例如下:

[self.player stop];
  1. 销毁播放器

销毁播放器实例,有同步和异步两种销毁方式,示例如下:

//同步销毁,内部会自动调用stop接口
[self.player destroy];
//异步销毁,内部会自动调用stop接口
[self.player destroyAsync];
说明

调用同步销毁接口需等待播放器资源完全释放后才返回。如果您对界面的响应速度有较高要求,建议使用异步销毁接口,并注意以下几点:

  1. 避免在异步销毁过程中对播放器对象执行任何其他操作。

  2. 无需在调用异步销毁之前手动停止播放器,因为该过程内部已经包含了异步化的停止流程。

辅助功能

  1. 日志开关

    // 开启日志
    [AliPlayer setEnableLog:YES];
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_TRACE callbackBlock:nil];
    
    // 关闭日志
    [AliPlayer setEnableLog:NO];
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_NONE callbackBlock:nil];
  2. 直播降级

    1. RTS自动降级

      在使用超低延时直播RTS地址播放的场景下,当不设置RTS降级地址且RTS拉流失败时,会自动降级到RTS对应的默认FLV地址进行播放。示例如下:

      // 1表示开启,0表示关闭。默认开启
      [AliPlayerGlobalSettings setOption:ALLOW_PRE_RENDER valueInt:1];
    2. 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];
  3. 获取TraceID

    每一次低延时播放都会有一个traceId,可用于问题排查,可以通过播放器事件回调拿到traceid

    //监听播放器 onPlayerEvent 回调,并解析 DemuxerTraceID 消息
    - (void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
        switch (eventWithString) {
            case EVENT_PLAYER_DEMUXER_TRACE_ID:
                {
                    NSString *traceId = description;
                }
                    break;
                default:
                    break;
        }
    }