iOS应用端接入

更新时间: 2023-02-17 14:07:20

iOS应用端SDK提供了音视频播放、语音对讲等功能。

开发前的环境要求

类别

说明

系统版本

支持iOS 9.0及以上版本。

开发工具

本文基于Xcode开发,建议您使用Xcode工具。Xcode详细信息,请参考Xcode

配置步骤

  1. 在Xcode项目下的podfile配置文件中,添加如下引用源。

    source 'https://github.com/aliyun/aliyun-specs.git'
  2. 在podfile配置文件中添加依赖库。

    pod 'IMSLinkVisualMedia_Base', '1.5.10'
  3. 执行pod update命令,获取SDK。

  4. 确认项目的pods目录下,已生成如下表所示4个framework文件,即成功获取SDK。

    framework文件及其主要功能如下表。

    文件名

    功能

    FFmpeg

    FFmpeg标准开源库,版本为4.4.1。

    LibRtmp.framework

    RTMP库,用于推流和拉流。

    LinkVisualClientSDK.framework

    FFmpeg与LibRtmp等业务的组合库。

    IMSLinkVisualMedia.framework

    iOS应用端库,包括渲染、播放等功能。

视频播放

背景信息

  • 播放器使用的FFmpeg版本为4.0.1。

  • 播放器支持的音频编码协议:AAC_LC和G711a。

  • 播放器支持的视频编码协议:H.264和H.265。

类型介绍

应用端根据播放协议,提供RTMP播放器和HLS播放器。其中RTMP播放器包括直播播放器和设备录像点播播放器。各播放器的主要功能和特点如下表。

协议

类型

描述

RTMP

直播播放器

用于RTMP协议的直播源,具有延时低的特点。

说明

使用该功能,需要在进行视频直播的IPC设备上接入设备端LinkVisual SDK。

设备录像点播播放器

用于RTMP协议的设备录像回放,可调整播放进度。

HLS

云端HLS播放器

  • 用于播放存储在云端的HLS协议录像文件。

  • 支持MPEG-TS容器和fMP4容器。

  • 支持AES-128加密方式。

功能列表

各播放器的功能如下表:

功能

直播播放器

设备录像点播播放器

云端HLS播放器

视频播放

支持

支持

支持

音频播放

支持

支持

支持

暂停或恢复

不支持

支持

支持

跳至指定位置播放

不支持

支持

支持

总时长

不支持

支持

支持

当前播放进度

不支持

支持

支持

播放器状态变更通知

支持

支持

支持

静音

支持

支持

支持

变速播放

不支持

不支持

支持

循环播放

不支持

不支持

不支持

画面缩放模式设置

支持

支持

支持

播放器截图

支持

支持

支持

边播边录

支持

支持

支持

直播播放器

使用指南

  1. 引入框架。

    //引入框架
    #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
  2. 设置播放器日志。

    //打开播放器日志  建议为IMSLinkVisualMediaLogInfo
    [IMSLinkVisualPlayerViewController setLogLevel:IMSLinkVisualMediaLogInfo];
  3. 创建播放器。

        //创建播放器
        IMSLinkVisualPlayerViewController *player = [[IMSLinkVisualPlayerViewController alloc] init];
        //因为播放器为viewController,所以addChildViewController
        [self addChildViewController:player];
        //设置播放器frame
        player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        player.view.frame = self.view.bounds;
        //添加播放器view到指定位置
        [self.view insertSubview:player.view atIndex:0];
        //播放器代理
        player.delegate = self; 
  4. 设置播放源。

    • 直播播放器

          //设置参数 iotId
          [player setDataSource:self.iotId 
                     streamType:IMSLinkVisualPlayerLiveStreamTypeMain 
                needForceIFrame:true];
          //设置参数 rtmpPath RTMP地址
          //needEncrypt若设置为false,则表示不需要加密,参数iv和key请传入nil
          /*
            注:直播切到手机后台后会自动调用stop方法,如果再次回到直播界面需要重新设置rtmpPath地址,并调用start方法
               rtmpPath具有时效性,如果rtmpPath已过期,需要重新获取rtmpPath地址
             设备录像点播播放器和云端HLS播放器不需要以上操作,请忽略
          */
          [player setDataSource_Live:rtmpPath
                         needEncrypt:needEncrypt
                                  iv:iv
                                 key:key];
    • 设备录像点播播放器

      • 以录像时间播放视频,请参考如下代码。

            //设置参数(按时间)
            //时间接口中vodStartTime为当天0点时间戳,vodEndTime为当天23点59秒时间戳,seekTime为本次播放的起始时间(秒)
            [player setDataSource:iotId 
                     vodStartTime:timestamp 
                       vodEndTime:timestamp + dayOfSecond seekTime:time];
             
            //设置参数 rtmpPath RTMP地址
            //needEncrypt若设置为false,则表示不需要加密,参数iv和key请传入nil
            [player setDataSource_Vod:rtmpPath
                           needEncrypt:needEncrypt
                                    iv:iv
                                   key:key];
      • 以录像文件名播放视频,请参考如下代码。

            //设置参数(按文件名)
            [player setDataSource:iotId  
                      vodFileName:vodFileName];
            
             //设置参数 rtmpPath RTMP地址
            //needEncrypt若设置为false,则表示不需要加密,参数iv和key请传入nil
            [player setDataSource_Vod:rtmpPath
                           needEncrypt:needEncrypt
                                    iv:iv
                                   key:key];
  5. 设置并使用播放器功能。

    • 开始播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 开始播放
      [self.player start];
    • 静音播放器

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //播放器静音,对讲不播放接收到的声音通过mute实现
      self.player.mute = true;
    • 停止播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 停止播放,结束播放器
      [self.player stop];
    • 直播重连

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //自动重连,默认0次。 
      //自动重连只支持直播功能
      self.player.reconnect = 10;
    • 变声设置

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      /*
       变声处理参数仅支持设置为0和1, 默认为0
       0表示不变声;1表示中年男子声音 
       如需要实现自定义变声,需设置为0,然后处理对讲声音回调
       **/
      self.player.voiceChangeType = 0;
    • 设置

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 停止播放,结束播放器
      [self.player stop];
    • (仅支持设备录像点播播放器)暂停播放

      说明

      下文简称设备录像点播播放器为点播播放器。

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 暂停播放
      [self.player pause];
    • (仅支持点播播放器)暂停播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 暂停播放
      [self.player pause];
    • (仅支持点播播放器)恢复播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 恢复播放
      [self.player restore];
    • (仅支持点播播放器)倍速播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 倍速播放
      self.player.playSpeed = PlaySpeed_NORMAL;
    • 视频截图

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //获取视频截图
      UIImage *image = [self.player videoSnapshot];                            
    • (不支持云端HLS录像播放器)边录边播

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      - (IBAction)recordVideoButtonClick:(UIButton *)sender {
          sender.selected = !sender.selected;
          NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.mp4"];
          if (sender.selected) {
              [self.player startRecordVideoWithfilePath:tmpPath];
          } else {
              [self.player stopRecordVideo];
          }
      }
    • 设置播放器缓存

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      /**
       //设置播放器缓存(缓存越大,延迟越高),一帧缓存延迟40毫秒,默认为5帧
       @param buffer 缓存大小为0~16帧
       */
      [self.player setDisplyBuffer:10];
    • 设置播放器渲染模式

      /// 播放器渲染模式
      typedef NS_ENUM(NSUInteger, IMSLinkVisualPlayerDisplayMode){
          /// 应用端开发者对YUV数据不可见,完全由SDK处理和渲染,默认使用这个模式
          IMSLinkVisualPlayerDisplayMode_SDK,
          /// 允许应用端开发者对YUV数据进行二次加工,然后再还给SDK渲染
          IMSLinkVisualPlayerDisplayMode_Client_SDK,
          /// YUV数据完全交由应用端开发者处理和渲染
          IMSLinkVisualPlayerDisplayMode_Client
      };
      
      /// 设置播放器渲染模式,默认为IMSLinkVisualPlayerDisplayMode_SDK模式
      @property (assign, nonatomic) IMSLinkVisualPlayerDisplayMode lvDisplayMode;
      
      /**
       直播、点播的共用代理接口
       视频帧YUV数据回调,同步接口,帧数据的内存和SDK是共用的,如外部需要缓存数据,必须把数据拷贝出去
       @see IMSLinkVisualPlayerViewController
       @param frame 视频帧YUV数据
       */
      - (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player withFrame:(IMSPlayerVideoFrame *_Nullable)frame;
  6. 使用播放器。

    • 直播播放器

          //设置参数 rtmpPath RTMP地址
          //needEncrypt若设置为false,则表示不需要加密,参数iv和key请传入nil
          [player setDataSource_Live:rtmpPath
                         needEncrypt:needEncrypt
                                  iv:iv
                                 key:key];
    • 设备录像点播播放器

          //设置参数 rtmpPath RTMP地址
          //needEncrypt若设置为false,则表示不需要加密,参数iv和key请传入nil
          [player setDataSource_Vod:rtmpPath
                         needEncrypt:needEncrypt
                                  iv:iv
                                 key:key];
  7. 查看播放器状态。

    /// 播放器状态
    typedef NS_ENUM(NSUInteger,IMSLinkVisualPlayerState){
        /// 空闲
        IMSLinkVisualPlayerStateIdle = 0,
        /// 缓冲中
        IMSLinkVisualPlayerStateBuffering = 2,
        /// 开始播放
        IMSLinkVisualPlayerStateStartPlay = 4,
        /// 暂停播放
        IMSLinkVisualPlayerStatePausePlay = 8,
        /// 切换到后台
        IMSLinkVisualPlayerStateBackground = 16,
    };
  8. 监听回调结果。

    @protocol IMSLinkVisualDelegate <NSObject>
    
    /*------------------直播、点播共用代理接口---------------------*/
    
    /**
     直播、点播 共用接口
     连接成功
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualConnect:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     直播、点播 共用接口
     准备完成进入播放状态
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualReady:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     直播、点播 共用接口
     播放成功停止(正常停止)
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualStop:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     直播、点播 共用接口
     连接错误回调 (所有直播点播错误,都通过这个代理回调)
     @see IMSLinkVisualPlayerViewController
     @param error 错误信息 IMSLinkVisualPlayerError枚举 对应 error.code
     */
    - (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player errorOccurred:(NSError *_Nullable)error;
    
    /**
     直播、点播 共用接口
     视频帧YUV数据回调,同步接口,帧数据的内存和SDK是共用的,如外部需要缓存数据,必须把数据拷贝出去
     @see IMSLinkVisualPlayerViewController
     @param frame 视频帧YUV数据
     */
    - (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player withFrame:(IMSPlayerVideoFrame *_Nullable)frame;
    
    
    /*---------------------点播独占代理接口-----------------------*/
    
    /**
     点播
     seek成功完成
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualReplaySeekReady:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     恢复播放成功完成
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualRestore:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     暂停播放成功完成
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualPause:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     播放到结尾的回调
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualPlayEnd:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     当前时间回调
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualReplay:(IMSLinkVisualPlayerViewController *_Nullable)player
                 currentTime:(NSInteger)currentTime;
    
    /// SEI回调接口
    /// @param player  播放器
    /// @param data  回调二进制数据 data.length为数据长度
    /// @param timeStamp  时间戳
    - (void)linkVisualReplay:(IMSLinkVisualPlayerViewController *_Nullable)player
                      buffer:(NSData*_Nullable)data
                   timeStamp:(NSInteger)timeStamp;
    
    @end

点播播放器

使用指南

  1. 创建云端HLS播放器。

         //创建播放器
        IMSLinkVisualPlayerViewController *player = [[IMSLinkVisualPlayerViewController alloc] init];
        //因为播放器为viewController,所以addChildViewController
        [self addChildViewController:player];
        //设置播放器frame
        player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        player.view.frame = self.view.bounds;
        //添加播放器view到指定位置
        [self.view insertSubview:player.view atIndex:0];
        //播放器代理
        player.delegate = self; 
  2. 设置云端HLS参数。

         //设置参数 HLSPath http***.m3u8 seekTime的单位为秒
        [player setDataSource_HLS:hlsPath 
                         seekTime:seekTime];
  3. 设置并使用播放器功能。

    • 开始播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 开始播放
      [self.player start];
    • 静音播放器

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //播放器静音,对讲不播放接收到的声音通过mute实现
      self.player.mute = true;
    • 停止播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 停止播放,结束播放器
      [self.player stop];
    • 直播重连

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //自动重连,默认0次。 
      //自动重连只支持直播功能
      self.player.reconnect = 10;
    • 变声设置

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      /*
       变声处理参数仅支持设置为0和1, 默认为0
       0表示不变声;1表示中年男子声音 
       如需要实现自定义变声,需设置为0,然后处理对讲声音回调
       **/
      self.player.voiceChangeType = 0;
    • 设置

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 停止播放,结束播放器
      [self.player stop];
    • (仅支持设备录像点播播放器)暂停播放

      说明

      下文简称设备录像点播播放器为点播播放器。

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 暂停播放
      [self.player pause];
    • (仅支持点播播放器)暂停播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 暂停播放
      [self.player pause];
    • (仅支持点播播放器)恢复播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 恢复播放
      [self.player restore];
    • (仅支持点播播放器)倍速播放

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      // 倍速播放
      self.player.playSpeed = PlaySpeed_NORMAL;
    • 视频截图

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //获取视频截图
      UIImage *image = [self.player videoSnapshot];                            
    • (不支持云端HLS录像播放器)边录边播

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      - (IBAction)recordVideoButtonClick:(UIButton *)sender {
          sender.selected = !sender.selected;
          NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.mp4"];
          if (sender.selected) {
              [self.player startRecordVideoWithfilePath:tmpPath];
          } else {
              [self.player stopRecordVideo];
          }
      }
    • 设置播放器缓存

      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      /**
       //设置播放器缓存(缓存越大,延迟越高),一帧缓存延迟40毫秒,默认为5帧
       @param buffer 缓存大小为0~16帧
       */
      [self.player setDisplyBuffer:10];
    • 设置播放器渲染模式

      /// 播放器渲染模式
      typedef NS_ENUM(NSUInteger, IMSLinkVisualPlayerDisplayMode){
          /// 应用端开发者对YUV数据不可见,完全由SDK处理和渲染,默认使用这个模式
          IMSLinkVisualPlayerDisplayMode_SDK,
          /// 允许应用端开发者对YUV数据进行二次加工,然后再还给SDK渲染
          IMSLinkVisualPlayerDisplayMode_Client_SDK,
          /// YUV数据完全交由应用端开发者处理和渲染
          IMSLinkVisualPlayerDisplayMode_Client
      };
      
      /// 设置播放器渲染模式,默认为IMSLinkVisualPlayerDisplayMode_SDK模式
      @property (assign, nonatomic) IMSLinkVisualPlayerDisplayMode lvDisplayMode;
      
      /**
       直播、点播的共用代理接口
       视频帧YUV数据回调,同步接口,帧数据的内存和SDK是共用的,如外部需要缓存数据,必须把数据拷贝出去
       @see IMSLinkVisualPlayerViewController
       @param frame 视频帧YUV数据
       */
      - (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player withFrame:(IMSPlayerVideoFrame *_Nullable)frame;
  4. 查看播放器状态。

    /// 播放器状态
    typedef NS_ENUM(NSUInteger,IMSLinkVisualPlayerState){
        /// 空闲
        IMSLinkVisualPlayerStateIdle = 0,
        /// 缓冲中
        IMSLinkVisualPlayerStateBuffering = 2,
        /// 开始播放
        IMSLinkVisualPlayerStateStartPlay = 4,
        /// 暂停播放
        IMSLinkVisualPlayerStatePausePlay = 8,
        /// 切换到后台
        IMSLinkVisualPlayerStateBackground = 16,
    };
  5. 监听回调结果。

    @protocol IMSLinkVisualDelegate <NSObject>
    
    /*------------------直播、点播共用代理接口---------------------*/
    
    /**
     直播、点播 共用接口
     连接成功
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualConnect:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     直播、点播 共用接口
     准备完成进入播放状态
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualReady:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     直播、点播 共用接口
     播放成功停止(正常停止)
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualStop:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     直播、点播 共用接口
     连接错误回调 (所有直播点播错误,都通过这个代理回调)
     @see IMSLinkVisualPlayerViewController
     @param error 错误信息 IMSLinkVisualPlayerError枚举 对应 error.code
     */
    - (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player errorOccurred:(NSError *_Nullable)error;
    
    /**
     直播、点播 共用接口
     视频帧YUV数据回调,同步接口,帧数据的内存和SDK是共用的,如外部需要缓存数据,必须把数据拷贝出去
     @see IMSLinkVisualPlayerViewController
     @param frame 视频帧YUV数据
     */
    - (void)linkVisual:(IMSLinkVisualPlayerViewController *_Nullable)player withFrame:(IMSPlayerVideoFrame *_Nullable)frame;
    
    
    /*---------------------点播独占代理接口-----------------------*/
    
    /**
     点播
     seek成功完成
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualReplaySeekReady:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     恢复播放成功完成
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualRestore:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     暂停播放成功完成
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualPause:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     播放到结尾的回调
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualPlayEnd:(IMSLinkVisualPlayerViewController *_Nullable)player;
    
    /**
     点播
     当前时间回调
     @see IMSLinkVisualPlayerViewController
     */
    - (void)linkVisualReplay:(IMSLinkVisualPlayerViewController *_Nullable)player
                 currentTime:(NSInteger)currentTime;
    
    /// SEI回调接口
    /// @param player  播放器
    /// @param data  回调二进制数据 data.length为数据长度
    /// @param timeStamp  时间戳
    - (void)linkVisualReplay:(IMSLinkVisualPlayerViewController *_Nullable)player
                      buffer:(NSData*_Nullable)data
                   timeStamp:(NSInteger)timeStamp;
    
    @end

错误列表

本文中描述的错误子码,通过解析userInfo中的subCode获取。

错误主码:ErrorSource

该错误主码表示数据源相关错误。

子码

描述

解决方法

IMSLinkVisualPlayerErrorConnect

建立连接失败。

请您检查并确保网络连接正常,然后重试。

IMSLinkVisualPlayerErrorEncrypt

无效的解密密钥。

您可忽略该故障,或联系与您对接的阿里云技术人员。

IMSLinkVisualPlayerErrorUrl

无效的播放地址。

您可忽略该故障,或联系与您对接的阿里云技术人员。

IMSLinkVisualPlayerErrorDataSource

数据源错误或未设置。

请检查并确保配置参数合法没然后重试。

IMSLinkVisualPlayerErrorGetURL

获取播放地址失败。

请根据错误信息中msg字段的描述,确定问题并修复。

IMSLinkVisualPlayerErrorStop

关闭失败。

该错误仅用于记录日志,您可忽略该错误。

IMSLinkVisualPlayerErrorStart

启动失败。

请重新播放,若仍然失败,请联系与您对接的阿里云技术人员。

错误主码:ErrorRender

该错误主码表示渲染相关错误。

子码

描述

解决方法

IMSLinkVisualPlayerErrorDecode

解码错误。

持续一段时间解码都失败时会触发该错误,请您检查设备编码是否异常并修复,然后重试。

说明

iOS应用端目前不支持码流转存,您可以使用Android应用端的码流保存能力检查错误问题。

错误主码:ErrorUnexpected

该错误主码表示不符合预期错误。

子码

描述

解决方法

IMSLinkVisualPlayerErrorStream

接收数据流失败。

请检查以下项目,然后重试:

  • 检查IPC设备是否未推流。

  • 检查应用端和IPC设备端的网络是否正常。

语音对讲

对讲类型

语音对讲的类型及其注意事项如下:

类型

说明

注意事项

单向对讲

应用端采集并发送音频数据到设备端进行播放。

App端采集音频期间手机保持静音。

双向对讲

应用端和设备端同时采集音频和播放音频。

设备端必须支持声学回声消除AEC(Acoustic Echo Cancellation),否则不建议使用该功能。

音频类型

语音对讲支持G711a、G711u以及AAC编码方式,三种音频类型详细信息为:

说明

选择编码方式前,请确认您的设备端IPC设备是否支持。

  • 采样率:支持8 kHz和16 kHz。

  • 支持编码。

  • 支持解码。

操作步骤

  1. 创建语音对讲实例。

    IMSLinkVisualPlayerViewController * player = [IMSLinkVisualPlayerViewController new];
  2. 设置对接参数,即MIC采集参数。

    IMSLinkVisualAudioParams *intercomEncodeParams = [[IMSLinkVisualAudioParams alloc] init];
        intercomEncodeParams.sampleRate = 8000;
        intercomEncodeParams.channel = 1;
        intercomEncodeParams.bitsPerSample = 16;
        intercomEncodeParams.format = IMSLinkVisualAudioFormatG711a;
        player.intercomEncodeParams = intercomEncodeParams;
  3. 设置代理回调。

    player.intercomDelegate = self;
  4. 启动对接。

    [player startIntercom:IMSLinkVisualIntercomAudioModeIntercom];
  5. 在采集回调里发送对讲数据。

     - (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController * _Nullable)player recordData:(NSData * _Nullable)data {
        ///直接发送
        [player sendAudioData:data];
    }
  6. 当需要停止语音对讲时,调用以下方法,停止对讲。

    [player stopIntercom];

接口说明

创建实例

  IMSLinkVisualPlayerViewController * player = [IMSLinkVisualPlayerViewController new]; //创建语音对讲实例
    player.intercomEncodeParams = intercomEncodeParams; //设置对讲模式和音频参数

设置对讲数据源

/**
 设置对讲业务数据源
 @param rtmpPath:rtmp地址
 @param needEncrypt:是否加密,对讲都为加密,此处设置为true
 @param iv:解密向量,16 Byte,如需base64转码请自行查阅文档
 @param key:解密密钥,16 Byte,如需base64转码请自行查阅文档
 NSData* iv = [[NSData alloc] initWithBase64EncodedString:ivString options:NSDataBase64DecodingIgnoreUnknownCharacters];
 @return 是否成功设置数据源
 */

- (BOOL)setDataSource_Intercom:(NSString *_Nullable)rtmpPath
             needEncrypt:(BOOL)needEncrypt
                   iv:(NSData *_Nullable)iv
                  key:(NSData *_Nullable)key;

启动对讲

/**
 开始语音对讲
 @param mode即对讲音源模式,可设置为:
   0:播放直播音频(播放器获取播放器画面与声音时,支持此模式)
   1:播放对讲音频 
   2:不使用播放器播放(使用者只接收数据,不播放或自行播放)
 */
- (void)startIntercom:(IMSLinkVisualIntercomAudioMode)mode;

发送手机端MIC录制的音频数据到设备端

/**
 发送设备端接收的录音数据,格式为脉冲编码调制PCM(Pulse Code Modulation),
 iOS SDK会转码成intercomEncodeParams指定的格式
 @param data:语音数据,该数据请使用对讲代理中,录音机数据回调返回的音频数据进行填充
 */
- (void)sendAudioData:(NSData *_Nullable)data;

停止对讲

/**
 结束语音对讲
 */
- (void)stopIntercom;

代理方法

连接服务器

/**
 语音对讲成功连接服务器
 @see IMSLinkVisualPlayerViewController
 */
- (void)linkVisualIntercomConnect:(IMSLinkVisualPlayerViewController *_Nullable)player;

准备完成

/**
 语音对讲准备完成
 @see IMSLinkVisualPlayerViewController
 */
- (void)linkVisualIntercomReady:(IMSLinkVisualPlayerViewController *_Nullable)player;

接收设备端音频参数

/**
 接收到设备端的音频参数
 @see IMSLinkVisualPlayerViewController
 @see IMSLinkVisualAudioParams
 @param params 音频参数
 */
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *_Nullable)player
               audioParams:(IMSLinkVisualAudioParams *_Nullable)params;

接收设备端音频数据

/**
 接收到设备端的音频数据
 @see IMSLinkVisualPlayerViewController
 @param data 音频数据
 */
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *_Nullable)player
                 audioData:(NSData *_Nullable)data;

手机端的录音数据回调

/**
 手机端的录音数据回调
 @see IMSLinkVisualPlayerViewController
 @param data 音频数据
 */
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *_Nullable)player
                recordData:(NSData *_Nullable)data;

停止语音对讲

/**
 停止语音对讲
 @see IMSLinkVisualPlayerViewController
 */
- (void)linkVisualIntercomStop:(IMSLinkVisualPlayerViewController *_Nullable)player;

错误回调

/**
 语音对讲错误回调
 @see IMSLinkVisualPlayerViewController
 @see IMSLinkVisualIntercomError
 @param error 错误 IMSLinkVisualIntercomError枚举 对应 error.code
 */
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *_Nullable)player
             errorOccurred:(NSError *_Nullable)error;

错误列表

错误枚举

描述

解决方法

IMSLinkVisualIntercomErrorGetURL

获取链接失败。

请确认以下设置项然后重试:

  • 确认填充参数是否正确。

  • 确认平台设置是否正确。

  • 请确认是否已开启对讲的物模型。

IMSLinkVisualIntercomErrorInUse

对讲正在使用。

设备正在与他人对讲,请等待或关闭他人对讲,然后重试。

IMSLinkVisualIntercomErrorStart

启动失败。

请重新启动。

IMSLinkVisualIntercomErrorConnect

建立连接失败。

请重新启动。

IMSLinkVisualIntercomErrorParams

语音对讲参数错误。

请确认以下设置项然后重试:

  • 确认对讲参数是否正确。

  • 确认设备是否支持语音对讲。

IMSLinkVisualIntercomErrorStream

接收参数错误。

请确认网络或数据是否异常,然后重新启动。

IMSLinkVisualIntercomErrorDecode

解码错误。

请确认设备端是否按照要求发送了数据,然后重新启动。

IMSLinkVisualIntercomErrorRecorder

录音机运行失败。

对讲录音被占用,请尝试关闭其它对讲后,重新启动对讲。

IMSLinkVisualIntercomErrorSendData

发送对讲数据失败。

对讲状态异常,请尝试关闭后重新启动对讲。

IMSLinkVisualIntercomErrorStop

关闭对讲失败。

该报错可忽略,如有需要,您可重新发起对讲。