本节主要为Link Visual iOS版本的音视频模块使用说明,包含视频播放、语音对讲的功能。

依赖SDK 概述
API 通道 提供API通道能力
长连通道 P2P需要长连接通道

配置工程

  1. podfile中添加引用源。
    source 'https://github.com/aliyun/aliyun-specs.git'
  2. 添加库依赖。
    //如遇IMS***版本冲突,请按照pod提示修改podfile对应sdk版本
    //如podfile中没有的sdk库,请查看podfile.lock对应修改podfile
    pod 'IMSLinkVisualMedia', '1.5.3'
  3. 执行pod update,则库安装完毕。

播放器说明

播放器按功能分为三种,提供了以下功能。

  • 直播播放器
    • 用于RTMP直播源,具有时延低的特点
    • 支持P2P(需使用接入LinkVisual设备端SDK的摄像头)
  • TF卡点播播放器

    用于设备录像回放,可调整播放进度

  • 云端HLS播放器

    用于基于HLS的云端录像回放的播放,支持MPEG-TS和FMP4容器,AES-128加密方式。

功能 直播播放器 TF卡点播播放器 云端HLS播放器
视频播放
音频播放
暂停/恢复 x
跳至指定位置播放 X
总时长 x
当前播放进度 x
播放器状态变更通知
静音
变速播放 x
画面缩放模式设置
播放器截图
边播边录
提供YUV数据
提供SEI数据

播放器使用指南

  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地址
               TF卡点播和HLS播放不需要以上操作,请忽略
          */
          [player setDataSource_Live:rtmpPath
                         needEncrypt:needEncrypt
                                  iv:iv
                                 key:key];
    • TF卡点播播放器
          //设置参数(时间)
          //时间接口中vodStartTime为当天0点时间戳,vodEndTime为当天23点59秒时间戳,seekTime为本次播放的起始时间(秒)
          [player setDataSource:iotId 
                   vodStartTime:timestamp 
                     vodEndTime:timestamp + dayOfSecond seekTime:time];
          //设置参数(文件)
          [player setDataSource:iotId  
                    vodFileName:vodFileName];
          //设置参数 rtmpPath rtmp地址
          //needEncrypt false 不需要加密,参数iv和key都传nil
          [player setDataSource_Vod:rtmpPath
                         needEncrypt:needEncrypt
                                  iv:iv
                                 key:key];
    • 云端HLS播放器

      设置云端HLS

          //设置参数 (文件)
          [player setDataSource:iotId 
                    hlsFileName:file.fileName 
                       seekTime:seekTime];
           //设置参数 HLSPath http***.m3u8 seekTime的单位:秒
          [player setDataSource_HLS:hlsPath 
                           seekTime:seekTime];
  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>
      
      // 暂停播放
      [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];
                                      
    • 视频截图
      #import <IMSLinkVisualMedia/IMSLinkVisualMedia.h>
      
      //获取视频截图
      UIImage *image = [self.player videoSnapshot];
                                      
    • 边录边播 (不支持hlsPlayer)
      #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>
      /**
       //设置播放器缓存(缓存越大,延迟越高),一帧缓存延迟40ms,默认为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. 查看播放器状态。
    /// 播放器状态
    typedef NS_ENUM(NSUInteger,IMSLinkVisualPlayerState){
        /// 空闲
        IMSLinkVisualPlayerStateIdle = 0,
        /// 缓冲中
        IMSLinkVisualPlayerStateBuffering = 2,
        /// 开始播放
        IMSLinkVisualPlayerStateStartPlay = 4,
        /// 暂停播放
        IMSLinkVisualPlayerStatePausePlay = 8,
        /// 切换到后台
        IMSLinkVisualPlayerStateBackground = 16,
    };
  7. 监听回调结果。
    @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;
    
    /**
    直播、点播 共用接口
    分辨率发生变化时回调,会触发停止录像
    EVENT_RESOLUTION_CHANGE
    @see IMSLinkVisualPlayerViewController
    @param width 宽
    @param height 高
    */
    - (void)linkVisualResolutionChange:(IMSLinkVisualPlayerViewController *_Nullable)player width:(NSInteger)width height:(NSInteger)height;
    
    
    
    
    /*---------------------点播独占代理接口-----------------------*/
    
    /**
     点播
     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

播放器错误列表

错误主码(PlayerMainError) 描述 子码(解析userInfo中subCode获取) 描述
ErrorSource 数据源相关错误 IMSLinkVisualPlayerErrorConnect 建立连接失败
IMSLinkVisualPlayerErrorEncrypt 无效的解密密钥
IMSLinkVisualPlayerErrorUrl 无效的播放地址
IMSLinkVisualPlayerErrorDataSource 数据源错误或未设置
IMSLinkVisualPlayerErrorGetURL 获取链接失败
IMSLinkVisualPlayerErrorStop 关闭失败
IMSLinkVisualPlayerErrorStart 启动失败
ErrorRender 渲染相关错误 IMSLinkVisualPlayerErrorDecode 解码错误
ErrorUnexpected 不符合预期错误 IMSLinkVisualPlayerErrorStream 接收数据流失败

语音对讲介绍

提供App和IPC设备之间端到端的双向实时音频传输能力。

单讲:App端采集并发送音频数据到设备端进行播放,App端采集音频期间手机保持声音静默

双讲:App端和设备端都需要同时做采音和放音,设备端必须支持AEC。

App端需实现的流程
支持的音频格式 编码 解码
AAC_LC
G711A
G711U

语音对讲使用指南

  • 创建语音对讲编码参数

    参数为录制语音数据的参数,用来与设备端对齐。

    //常用对讲模式为以下参数,不建议更改,支持8K和16K
    //sampleRate 8000 或 16000 以设备支持为准
        IMSLinkVisualAudioParams *intercomEncodeParams = [[IMSLinkVisualAudioParams alloc] init];
        intercomEncodeParams.sampleRate = 8000;
        intercomEncodeParams.channel = 1;
        intercomEncodeParams.bitsPerSample = 16;
        intercomEncodeParams.format = IMSLinkVisualAudioFormatG711a;
  • 设置语音对讲参数

    创建编码器用于编码语音数据。

        //player 为播放器实例 IMSLinkVisualPlayerViewController
        player.intercomEncodeParams = intercomEncodeParams;
  • 设置语音对讲回调代理

    用于语音对讲开始与结束流程的消息回调代理,开始对讲前,先增加语音对讲状态回调方法。

     player.intercomDelegate = self;
  • 开语音对讲

    设置播放器为对讲模式并开启对讲功能。

    [player startIntercom:IMSLinkVisualIntercomAudioModeIntercom];
  • 停止语音对讲
     [player stopIntercom];

语音对讲状态回调方法与触发规则如下。

#pragma mark - IMSLinkVisualIntercomDelegate
#pragma mark 语音对讲连接服务器
- (void)linkVisualIntercomConnect:(IMSLinkVisualPlayerViewController *)player {
    //语音对讲连接服务器成功
    //连接成功不代表可以可以立即发送语音
}#pragma mark 语音对讲ready
//当对讲连接于服务端连接建立后,若对端已就绪,会告知本端事件talk ready. 此时向对端发送音频数据都会被对端收到并处理.
- (void)linkVisualIntercomReady:(IMSLinkVisualPlayerViewController * _Nullable)player {
}
#pragma mark 对讲接收到设备端音频参数
//当语音对讲通道建立后,若对端支持录音,会先收到对端发送过来的音频参数信息,
//后续对端发送的音频数据按照此音频参数来做解码. 该事件是语音对讲通道建立成功的标志. 
//可以在此时构建音频播放器实例用于对端采集音频的实时播放.

- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)player audioParams:(IMSLinkVisualAudioParams *)params {
}

#pragma mark 对讲接收到设备端音频数据
//若对端支持录音,语音对讲中会持续不断的收到对端发送过来的音频数据.
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)intercom audioData:(NSData *)data {
    //无特殊需求可以不收集数据
    if (data) {
        //playBuffers为自定义可变数组收集数据
        [self.playBuffers addObject:data];
    }
}
#pragma mark 录音数据完成回调
//语音对讲开始后,会收集不断收到mic采集的数据,根据对讲的状态开始发送的数据

- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)intercom recordData:(NSData *)data{
    if (data) {
        //发送录音数据 audioBuffers为自定义可变数组收集数据
        [player sendAudioData:audioData];
    }
}   
#pragma mark 语音对讲停止
- (void)linkVisualIntercomStop:(IMSLinkVisualPlayerViewController *)player {
}
#pragma mark 语音对讲出错
- (void)linkVisualIntercom:(IMSLinkVisualPlayerViewController *)player
             errorOccurred:(NSError *)error {
 //处理对讲出错的错误信息
//error.code 与 IMSLinkVisualIntercomError 对应
    
}

对讲错误列表

语音对讲错误状态码 描述
IMSLinkVisualIntercomErrorGetURL 获取链接失败
IMSLinkVisualIntercomErrorParams 对讲参数错误
IMSLinkVisualIntercomErrorStart 启动对讲失败
IMSLinkVisualIntercomErrorConnect 语音流建立失败
IMSLinkVisualIntercomErrorRecorder 录音失败
IMSLinkVisualIntercomErrorStream 接收数据流失败
IMSLinkVisualIntercomErrorDecode 解码错误
IMSLinkVisualIntercomErrorSendData 发送语音对讲数据失败
IMSLinkVisualIntercomErrorStop 关闭失败