NIMNetCallManagerProtocol.h 26.4 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
//
//  NIMNetCallManagerProtocol.h
//  NIMLib
//
//  Created by Netease.
//  Copyright (c) 2015 Netease. All rights reserved.
//

#import <CoreMedia/CMSampleBuffer.h>
#import <NIMSDK/NIMPlatform.h>
#import "NIMAVChatDefs.h"

NS_ASSUME_NONNULL_BEGIN

@class NIMNetCallOption;
@class NIMNetCallMeeting;
@class NIMNetCallRecordingInfo;
@class NIMNetCallUserInfo;
@class NIMNetCallAudioFileMixTask;
@class NIMNetCallVideoCaptureParam;
@class NIMNetCallAudioCustomInputTask;
@class NIMNetCallNetstat;

/**
 *  发起通话Block
 *
 *  @param error 发起通话结果, 如果成功error为nil
 *  @param callID 发起通话的call id, 如果发起失败则为0
 */
typedef void(^NIMNetCallStartHandler)(NSError * __nullable error, UInt64 callID);

/**
 *  响应通话请求Block
 *
 *  @param error  响应通话请求结果, 如果成功error为nil
 *  @param callID 响应通话的call id
 */
typedef void(^NIMNetCallResponseHandler)(NSError * __nullable error, UInt64 callID);


/**
 *  预订或者加入多人会议请求Handler
 *
 *  @param meeting 预订或者加入的多人会议
 *  @param error   预订或者加入多人会议请求结果, 如果成功 error 为 nil
 */
typedef void(^NIMNetCallMeetingHandler)(NIMNetCallMeeting *meeting, NSError * __nullable error);

/**
 *  网络通话状态
 */
typedef NS_ENUM(NSInteger, NIMNetCallStatus){
    /**
     *  已连接
     */
    NIMNetCallStatusConnect,
    /**
     *  已断开
     */
    NIMNetCallStatusDisconnect,
};


/**
 *  网络通话控制类型
 */
typedef NS_ENUM(NSInteger, NIMNetCallControlType){
    /**
     *  开启了音频
     */
    NIMNetCallControlTypeOpenAudio      = 1,
    /**
     *  关闭了音频
     */
    NIMNetCallControlTypeCloseAudio     = 2,
    /**
     *  开启了视频
     */
    NIMNetCallControlTypeOpenVideo      = 3,
    /**
     *  关闭了视频
     */
    NIMNetCallControlTypeCloseVideo     = 4,
    /**
     *  切换到视频模式
     */
    NIMNetCallControlTypeToVideo        = 5,
    /**
     *  同意切换到视频模式,用于切到视频模式需要对方同意的场景
     */
    NIMNetCallControlTypeAgreeToVideo   = 6,
    /**
     *  拒绝切换到视频模式,用于切到视频模式需要对方同意的场景
     */
    NIMNetCallControlTypeRejectToVideo  = 7,
    /**
     *  切换到音频模式
     */
    NIMNetCallControlTypeToAudio        = 8,
    /**
     *  占线
     */
    NIMNetCallControlTypeBusyLine       = 9,
    /**
     *  没有可用摄像头
     */
    NIMNetCallControlTypeNoCamera       = 10,
    /**
     *  应用切换到了后台
     */
    NIMNetCallControlTypeBackground     = 11,
    /**
     *  收到呼叫请求的反馈,通常用于被叫告诉主叫可以播放回铃音了
     */
    NIMNetCallControlTypeFeedabck       = 12,
    
    /**
     *  开始录制
     */
    NIMNetCallControlTypeStartRecord = 13,
    
    /**
     *  结束录制
     */
    NIMNetCallControlTypeStopRecord = 14,

};

/**
 *  视频通话使用的摄像头
 */
typedef NS_ENUM(NSInteger, NIMNetCallCamera){
    /**
     *  前置摄像头
     */
    NIMNetCallCameraFront,
    /**
     *  后置摄像头
     */
    NIMNetCallCameraBack,
};

/**
 *  音视频聊天相关回调
 */
@protocol NIMNetCallManagerDelegate <NSObject>

@optional

/**
 *  被叫收到呼叫(振铃)
 *
 *  @param callID call id
 *  @param caller 主叫帐号
 *  @param type   呼叫类型
 *  @param extendMessage   扩展消息, 透传主叫发起通话时携带的该信息
 */
- (void)onReceive:(UInt64)callID
             from:(NSString *)caller
             type:(NIMNetCallMediaType)type
          message:(nullable NSString *)extendMessage;

/**
 *  主叫收到被叫响应
 *
 *  @param callID   call id
 *  @param callee 被叫帐号
 *  @param accepted 是否接听
 */
- (void)onResponse:(UInt64)callID
              from:(NSString *)callee
          accepted:(BOOL)accepted;

/**
 *  对方挂断电话
 *
 *  @param callID call id
 *  @param user   对方帐号
 */
- (void)onHangup:(UInt64)callID
              by:(NSString *)user;

/**
 *  这通呼入通话已经被该帐号其他端处理
 *
 *  @param callID   呼入通话的call id
 *  @param accepted 是否被接听
 */
- (void)onResponsedByOther:(UInt64)callID
                  accepted:(BOOL)accepted;

/**
 点对点通话建立成功

 @param callID call id
 */
- (void)onCallEstablished:(UInt64)callID;

/**
 通话异常断开

 @param callID call id
 @param error 断开的原因,如果是 nil 表示正常退出
 */
- (void)onCallDisconnected:(UInt64)callID
                 withError:(nullable NSError *)error;

/**
 *  收到对方网络通话控制信息,用于方便通话双方沟通信息
 *
 *  @param callID  相关网络通话的call id
 *  @param user    对方帐号
 *  @param control 控制类型
 */
- (void)onControl:(UInt64)callID
             from:(NSString *)user
             type:(NIMNetCallControlType)control;

/**
 *  当前通话网络质量
 *
 *  @param status 网络质量
 *  @param user   网络质量对应的用户;如果是自己,表示自己的发送网络状态
 */
- (void)onNetStatus:(NIMNetCallNetStatus)status
               user:(NSString *)user;

/**
 *  当前通话网络状态
 *
 *  @param stat 网络状态
 *  @param user   网络状态对应的用户;如果是自己,表示自己的发送网络状态
 */
- (void)onNetStat:(NIMNetCallNetstat *)stat
             user:(NSString *)user;

/**
 *  本地摄像头预览就绪
 *
 *  @param displayView 本地摄像头预览层
 */
- (void)onLocalDisplayviewReady:(UIView *)displayView;

/**
 *  本地视频采集方向切换完成回调
 *
 *  @param orientation  采集方向
 */
-(void)onCameraOrientationSwitchCompleted:(NIMVideoOrientation)orientation;

/**
 *  摄像头方向切换完成回调
 *
 *  @param cameraType  摄像头方向
 */
-(void)onCameraTypeSwitchCompleted:(NIMNetCallCamera)cameraType;

/**
 *  视频清晰度切换完成回调
 *
 *  @param videoQuality  清晰度
 */
-(void)onCameraQualitySwitchCompleted:(NIMNetCallVideoQuality)videoQuality;


/**
 *  远程视频YUV数据就绪
 *
 *  @param yuvData  远程视频YUV数据, 紧凑型 (stride 等于 width)
 *  @param width    远程视频画面宽度
 *  @param height   远程视频画面长度
 *  @param user     远程视频画面属于的用户
 *
 *  @discussion 将YUV数据直接渲染在OpenGL上比UIImageView贴图占用更少的cpu
 */
- (void)onRemoteYUVReady:(NSData *)yuvData
                   width:(NSUInteger)width
                  height:(NSUInteger)height
                    from:(NSString *)user API_UNAVAILABLE(macos);;


/**
 *  远程视频 SampleBuffer 数据就绪
 *
 *  @param sampleBuffer  远程视频 SampleBuffer 数据
 *  @param user     远程视频画面属于的用户
 *
 */
- (void)onRemoteVideo:(CMSampleBufferRef)sampleBuffer
                 from:(NSString *)user API_UNAVAILABLE(ios);;

/**
 *  远程视频画面就绪
 *
 *  @param image 远程视频画面
 *
 *  @discussion 如果你已经使用onRemoteYUVReady:width:height:得到的YUV数据渲染画面, 不要实现该委托以优化性能
 */
- (void)onRemoteImageReady:(CGImageRef)image;

/**
 *  录制成功开始
 *
 *  @param callID  录制的相关网络通话的call id
 *  @param fileURL 录制的文件路径
 *  @param userId  录制用户对象的id
 */
- (void)onRecordStarted:(UInt64)callID
                fileURL:(NSURL *)fileURL
                    uid:(NSString *)userId;
/**
 *  录制发生了错误
 *
 *  @param error  错误
 *  @param callID 录制错误相关网络通话的call id
 *  @param userId 录制用户对象的id
 */
- (void)onRecordError:(NSError *)error
               callID:(UInt64)callID
                  uid:(NSString *)userId;

/**
 *  录制成功结束
 *
 *  @param callID  录制的相关网络通话的call id
 *  @param fileURL 录制的文件路径
 *  @param userId  录制用户对象的id
 */
- (void)onRecordStopped:(UInt64)callID
                fileURL:(NSURL *)fileURL
                    uid:(NSString *)userId;

/**
 *  网络通话服务器录制信息
 *
 *  @param info 录制信息
 */
- (void)onNetCallRecordingInfo:(NIMNetCallRecordingInfo *)info;

/**
 *  用户加入了多人会议
 *
 *  @param uid     用户 id
 *  @param meeting 用户加入的会议
 */
- (void)onUserJoined:(NSString *)uid
             meeting:(NIMNetCallMeeting *)meeting;

/**
 *  用户离开了多人会议
 *
 *  @param uid    用户 id
 *  @param meeting 用户离开的会议
 */
- (void)onUserLeft:(NSString *)uid
           meeting:(NIMNetCallMeeting *)meeting;

/**
 *  会议发生了错误
 *
 *  @param error   错误信息
 *  @param meeting 发生错误的会议
 */
- (void)onMeetingError:(NSError *)error
               meeting:(NIMNetCallMeeting *)meeting;


/**
 *  自己当前音量
 *
 *  @param volume 音量
 */
-(void)onMyVolumeUpdate:(UInt16)volume;

/**
 *  正在说话的用户信息汇报
 *
 *  @param report 用户信息,包含音量,如果为空,表示没有说话的人
 */
- (void)onSpeakingUsersReport:(nullable NSArray<NIMNetCallUserInfo *> *)report;

/**
 当前语音文件混音任务完成回调
 */
- (void)onAudioMixTaskCompleted;

/**
 当前音效播放完成回调
 */
- (void)onSoundEffectPlayCompleted;

/**
 互动直播状态回调
 
 @param code 互动直播状态码
 */
- (void)onBypassStreamingStatus:(NIMBypassStreamingStatus)code;

/**
 * 摄像头开关状态回调
 *
 *  @param running 开启状态
 */
- (void)onCameraRunning:(BOOL)running;

/**
 *  自己被踢回调
 */
- (void)onKicked;

/**
 *  资源释放完毕通知
 */
- (void)onResourceFreed;

/**
 *  音频采集异常通知
 */
- (void)onAudioDeviceCaptureAbnormal;

/**
 *  音频采集异常恢复通知
 */

- (void)onAudioDeviceCaptureRecover;

/**
 *  会话时长
 *
 *  @param timeDuration 时长 单位:毫秒
 */
- (void)onSessionTimeDuration:(UInt64)timeDuration;

@end

/**
 *  网络通话协议
 */
@protocol NIMNetCallManager <NSObject>

/**
 *  主叫发起通话 - 新接口
 *
 *  @param callees    被叫帐号列表, 现在只支持传入一个被叫
 *  @param type       呼叫类型
 *  @param option     开始通话附带的选项, 可以为空。如果需要 SDK 自动开启摄像头,需要指定 option 的视频采集参数 videoCaptureParam
 *  @param completion 发起通话结果回调
 */
- (void)start:(NSArray<NSString *> *)callees
         type:(NIMNetCallMediaType)type
       option:(nullable NIMNetCallOption *)option
   completion:(nullable NIMNetCallStartHandler)completion;

/**
 *  被叫响应呼叫
 *
 *  @param callID      call id
 *  @param accept      是否接听
 *  @param option      开始通话附带的选项, 可以为空。如果需要 SDK 自动开启摄像头,需要指定 option 的视频采集参数 videoCaptureParam
 *  @param completion  响应呼叫结果回调
 *
 *  @discussion 被叫拒绝接听时, 主叫不需要再调用hangup:接口
 */
- (void)response:(UInt64)callID
          accept:(BOOL)accept
          option:(nullable NIMNetCallOption *)option
      completion:(nullable NIMNetCallResponseHandler)completion;

/**
 *  挂断通话
 *
 *  @param callID 需要挂断电话的call id, 如果尚未获取到call id就填0
 *
 *  @discussion 被叫在响应呼叫之前不要调用挂断接口
 */
- (void)hangup:(UInt64)callID;


/**
 *  预订多人会议
 *
 *  @param meeting    预订的多人会议
 *  @param completion 预订会议结果
 */
- (void)reserveMeeting:(NIMNetCallMeeting *)meeting
            completion:(nullable NIMNetCallMeetingHandler)completion;

/**
 *  加入多人会议
 *
 *  @param meeting    需要加入的多人会议
 *  @param completion 加入会议结果
 *
 *  @discussion 如果需要 SDK 自动开启摄像头,需要在 meeting 中指定 option 的视频采集参数 videoCaptureParam
 */
- (void)joinMeeting:(NIMNetCallMeeting *)meeting
         completion:(nullable NIMNetCallMeetingHandler)completion;

/**
 *  离开多人会议
 *
 *  @param meeting 需要离开的多人会议
 * 
 *  @discussion 当所有加入的人都离开了某会议, 该会议对应的名称才可以被重复预订
 *
 */
- (void)leaveMeeting:(NIMNetCallMeeting *)meeting;

/**
 *  开始视频采集。用于需要在开始音视频通话之前开启视频采集的场景
 *
 *  @param param  视频采集参数
 *
 *  @return 开始是否成功
 *
 *  @discussion 视频采集开始以后无法再调用该接口进行更新设置。需要先停止采集以后才能再次开始
 */
- (BOOL)startVideoCapture:(NIMNetCallVideoCaptureParam *)param;

/**
 *  设置视频采集方向
 *
 *  @param orientation  需要设置的方向
 *
 *  @return 设置是否成功
 *
 *  @discussion 用于互动直播场景。只能在开始视频采集以后调用
 */
- (BOOL)setVideoCaptureOrientation:(NIMVideoOrientation)orientation;

/**
 *  停止视频采集。用于在网络通话的自动停止视频采集选项 stopVideoCaptureOnLeave 未开启时主动管理采集的关闭操作
 */
- (void)stopVideoCapture;

/**
 *  切换网络通话摄像头
 *
 *  @param camera 选择的摄像头
 *
 *  @discussion 切换网络通话类型将丢失该设置
 */
- (void)switchCamera:(NIMNetCallCamera)camera API_UNAVAILABLE(macos);

/**
 *  设置摄像头关闭
 *
 *  @param disable 是否关闭
 *
 *  @return 设置是否成功
 *
 *  @discussion 仅支持当前为视频模式时进行此设置, 切换网络通话类型将丢失该设置
 */
- (BOOL)setCameraDisable:(BOOL)disable;

/**
 *  通话中切换视频质量
 *
 *  @param quality 期望的视频质量
 *
 *  @return 是否设置成功. 如果用户尚未加入, 则无法设置
 */
- (BOOL)switchVideoQuality:(NIMNetCallVideoQuality)quality;

/**
 *  改变自己在会议中的角色
 *
 *  @param actor 是否为发言者角色, 发言者发送音视频数据, 非发言者不发送音视频数据
 *
 *  @return 设置是否成功
 */
- (BOOL)setMeetingRole:(BOOL)actor;

/**
 *  指定某用户设置是否对其静音
 *
 *  @param mute 是否静音, 静音后将听不到该用户的声音
 *  @param uid  用户 uid
 *
 *  @return 是否设置成功. 如果用户尚未加入, 则无法设置
 */
- (BOOL)setAudioMute:(BOOL)mute forUser:(NSString *)uid;

/**
 指定所有远端用户是否对其静音
 
 @param mute 是否静音, 静音后将听不到所有用户的声音
 @return 是否设置成功.
 */
- (BOOL)setAllUserAudioMute:(BOOL)mute;

/**
 *  指定某用户设置是否接收其视频
 *
 *  @param mute 是否拒绝视频, 拒绝后将没有该用户视频数据回调
 *  @param uid  用户uid
 *
 *  @return 是否设置成功. 如果用户尚未加入, 则无法设置
 */
- (BOOL)setVideoMute:(BOOL)mute forUser:(NSString *)uid;


/**
 设置禁止发送视频

 @param mute 是否禁止发送视频
 @return 是否设置成功. 如果用户尚未加入, 则无法设置
 */
- (BOOL)setVideoSendMute:(BOOL)mute;

/**
 *  发送网络通话的控制信息,用于方便通话双方沟通信息
 *
 *  @param callID 控制信息相关通话的call id
 *  @param type   控制类型
 */
- (void)control:(UInt64)callID
           type:(NIMNetCallControlType)type;

/**
 *  设置网络通话麦克风静音
 *
 *  @param mute 是否开启麦克风静音
 *
 *  @return 开启麦克风静音是否成功
 *
 *  @discussion 该设置不影响伴音发送, 切换网络通话类型将丢失该设置
 */
- (BOOL)setMute:(BOOL)mute;

/**
 *  设置是否关闭语音发送,包含伴音
 *
 *  @param mute 是否关闭语音发送
 *
 *  @return 设置是否成功
 *
 */
- (BOOL)setAudioSendMute:(BOOL)mute;

/**
 *  设置网络通话扬声器模式
 *
 *  @param useSpeaker 是否开启扬声器
 *
 *  @return 开启扬声器是否成功
 *
 *  @discussion 切换网络通话类型将丢失该设置
 */
- (BOOL)setSpeaker:(BOOL)useSpeaker API_UNAVAILABLE(macos);

/**
 *  切换网络通话类型
 *
 *  @param type 通话类型
 *
 *  @discussion 切换通话类型会丢失这些设置: 静音模式, 扬声器模式, 摄像头关闭, 切换摄像头
 */
- (void)switchType:(NIMNetCallMediaType)type;


/**
 *  设置视频最大编码码率
 *
 *  @param bitrate 最大编码码率 (bps)
 *
 *  @return 是否设置成功
 */
- (BOOL)setVideoMaxEncodeBitrate:(NSUInteger)bitrate;


/**
 *  切换视频编码器
 *
 *  @param codec 视频编码器
 *
 *  @return 是否设置成功. 如果用户尚未加入, 则无法设置
 *
 *  @discussion 硬编码设置仅在iOS8及以上系统有效
 *
 */
- (BOOL)switchVideoEncoder:(NIMNetCallVideoCodec)codec;

/**
 *  切换视频解码器
 *
 *  @param codec 视频解码器
 *
 *  @return 是否设置成功. 如果用户尚未加入, 则无法设置
 *
 *  @discussion 硬解码设置仅在iOS8及以上系统有效
 *
 */
- (BOOL)switchVideoDecoder:(NIMNetCallVideoCodec)codec;

/**
 *  选择视频调控策略
 *
 *  @param videoAdaptiveStrategy 视频调控策略
 *
 *  @return 是否设置成功.
 */
- (BOOL)selectVideoAdaptiveStrategy:(NIMAVChatVideoAdaptiveStrategy)videoAdaptiveStrategy;

/**
 *  发送视频 SampleBuffer
 *
 *  @param buffer 只支持包含以下三种 CVPixelBuffer 数据格式的 sampleBuffer: kCVPixelFormatType_32BGRA、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange、kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
 *
 *  @discussion 可以发送SDK回调上来的视频数据,也可以发送自定义视频数据 自定义数据输入不能超过720P
 *
 *  @return 发送结果
 */
- (nullable NSError *)sendVideoSampleBuffer:(CMSampleBufferRef)buffer;

/**
 *  互动直播设置主画面
 *
 *  @param uid 被设置的用户id
 *
 *  @param completion 完成回调 如果设置成功 error 为 nil
 *
 *  @discussion 在互动直播下,动态切换布局,设置用户为主画面,只有互动直播主播可以设置
 */
- (void)setAsMainArea:(NSString *)uid completion:(void(^)(NSError * __nullable error))completion;

/**
 *  切换互动直播推流地址
 *
 *  @param url 推流地址
 *
 *  @return 是否设置成功
 */
- (BOOL)switchBypassStreamingUrl:(NSString *)url;

/**
 开始混音任务
 
 @param task 文件混音任务
 
 @return 结果, 如果成功开始了, 返回 nil
 
 @discussion 开始新的任务会结束正在进行中的任务
 */
- (nullable NSError *)startAudioMix:(NIMNetCallAudioFileMixTask *)task;
/**
 更新混音任务
 
 @param task 文件混音任务
 
 @return 结果, 如果成功开始了, 返回 nil
 
 @discussion 可以更新循环播放次数和音量等
 */
- (nullable NSError *)updateAudioMix:(NIMNetCallAudioFileMixTask *)task;

/**
 暂停混音
 
 @return 是否成功
 */
- (BOOL)pauseAudioMix;

/**
 恢复混音
 
 @return 是否成功
 */
- (BOOL)resumeAudioMix;

/**
 结束混音
 
 @return 是否成功
 */
- (BOOL)stopAudioMix;


/**
 获取当前进行中的混音任务

 @return 混音任务. 如果没有当前任务则返回 nil
 */
- (nullable NIMNetCallAudioFileMixTask *)currentAudioMixTask;


/**
 播放音效,用于在混音时播放短暂的音效
 
 @param task 音效任务。其中的 sendVolume 参数在播放音效中无效
 
 @return 结果, 如果成功开始了, 返回 nil
 */
- (nullable NSError *)playSoundEffect:(NIMNetCallAudioFileMixTask *)task;

/**
 混音文件总时长
 
 @return 总时长 单位ms
 */
- (SInt64)fileTotalTime;

/**
 混音文件当前播放时间
 
 @return 当前播放时间  单位ms
 */
- (SInt64)currentPlayTime;

/**
 混音文件seek到传入时间
 
 @param time 传入时间 单位ms
 */
- (void)seekToTime:(SInt64)time;

/**
 开始音频自定义输入
 
 @param task 自定义输入任务
 
 @return 结果 如果成功 返回 nil
 */
- (nullable NSError *)startAudioCustomInputTask:(NIMNetCallAudioCustomInputTask *)task API_UNAVAILABLE(macos);

/**
 输入音频pcm数据
 
 @param audioData 音频数据
 
 @param size 音频数据大小 单位字节 不能超过半秒数据 计算方式(采样率 * (mBytesPerPacket / mFramesPerPacket) * 0.5秒)
 
 @param sampleRate 采样率 需要与开始任务中的采样率一致
 
 @return 结果 如果成功 返回 nil
 
 @discussion     传入的音频数据格式(AudioStreamBasicDescription)需要符合
     mFormatID            = kAudioFormatLinearPCM;
     mFormatFlags         = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
     mFramesPerPacket     = 1;//每个packet的中frame的个数
     mChannelsPerFrame    = 1;//声道数
     mBitsPerChannel      = 16;//每个采样数据的位数
     mBytesPerPacket      = 2;//每个packet中数据的字节数
     内部不做校验(如果不符合可能会无声音或异常声音)
 */
- (nullable NSError *)inputAudioData:(SInt16 *)audioData
                                size:(UInt32)size
                          sampleRate:(Float64)sampleRate API_UNAVAILABLE(macos);
/**
 结束音频自定义输入
 */
- (void)stopAudioCustomInputTask API_UNAVAILABLE(macos);

/**
 打开耳返
 */
- (void)startEarBack;

/**
 关闭耳返
 */
- (void)stopEarBack;

/**
 调节耳返音量
 
 @param volume 耳返音量 接受输入值为 0 到 10
 
 @return 是否调节成功
 */
- (BOOL)changeEarBackVolume:(NSUInteger)volume;

/**
 *  获得当前视频通话的本地预览层
 *
 *  @return 预览层
 */
- (nullable UIView *)localPreview;

/**
 *  本地截图. 截取自己下一帧待发送的画面
 *
 *  @param result 截图结果
 *
 *  @discussion 如果截图失败, result 中 image 为 nil
 */
- (void)snapshotFromLocalVideoCompletion:(void(^)(UIImage * __nullable image))result;


/**
 *  获取正在进行中的网络通话call id
 *
 *  @return call id, 如果没有正在进行中的通话则返回0
 */
- (UInt64)currentCallID;

/**
 *  获取当前网络通话中某用户的网络状态
 *
 *  @param user 用户. 可以传入自己的 id 以获取自己的发送网络状况
 *
 *  @return 网络状态
 */
- (NIMNetCallNetStatus)netStatus:(NSString *)user;


/**
 *  开始MP4文件录制, 录制通话过程中自己的音视频内容到MP4文件
 *
 *  @param filePath     录制文件路径, SDK不负责创建目录, 请确保文件路径的合法性,
 *                      也可以传入nil, 由SDK自己选择文件路径
 *  @param videoBitrate 录制文件视频码率设置, 可以不指定, 由SDK自己选择合适的码率
 *
 *  @param userId       录制用户对象的id
 *
 *  @return 是否允许开始录制
 *
 *  @discussion 只有通话连接建立以后才允许开始录制
 */
- (BOOL)startRecording:(nullable NSURL *)filePath
          videoBitrate:(UInt32)videoBitrate
                   uid:(NSString *)userId;
/**
 *  停止MP4文件录制
 *
 *  @param userId 录制用户对象的id
 *
 *  @return 是否接受停止录制请求
 */
- (BOOL)stopRecordingWithUid:(NSString *)userId;

/**
 开始通话录音. 录制通话中所有参与者的声音, 包含混音任务播放的声音, 录制成 aac 或者 wav 文件
 
 @param filePath 录制文件路径, 不包含文件类型后缀. 包含文件类型后缀的完整文件路径可以在开始录制以后通过 currentAudioRecordingFilePath 查询.
 
 @discussion SDK不负责创建目录, 请确保文件路径的合法性, 也可以传入 nil, 由 SDK 自己选择文件路径

 @param error 错误. 如果开始通话录音失败, 此处回填错误码

 @return 开始通话录音的结果.
 */
- (BOOL)startAudioRecording:(nullable NSURL *)filePath
                      error:(NSError * __nullable *)error;


/**
 结束通话录音
 */
- (void)stopAudioRecording;

/**
 获取当前通话录音文件路径
 
 @return 当前通话录音文件路径. 如果没有进行中的通话录音则返回 nil
 */
- (nullable NSURL *)currentAudioRecordingFilePath;


/**
 *  获得 SDK 网络通话网络层log 文件路径
 *
 *  @return SDK 网络通话 log
 */
- (NSString *)netCallLogFilepath;

/**
 *  添加网络通话委托
 *
 *  @param delegate 网络通话委托
 */
- (void)addDelegate:(id<NIMNetCallManagerDelegate>)delegate;

/**
 *  移除网络通话委托
 *
 *  @param delegate 网络通话委托
 */
- (void)removeDelegate:(id<NIMNetCallManagerDelegate>)delegate;

/**
 选择滤镜类型
 
 @param type  滤镜类型
 
 @return 是否设置成功
 */
- (BOOL)selectBeautifyType:(NIMNetCallFilterType)type;

/**
 改变焦距 实际放大倍数
 
 @param scale 放大倍数
 
 @return 是否设置成功
 */
- (BOOL)changeLensPosition:(float)scale API_UNAVAILABLE(macos);

/**
 设置闪光灯开关
 
 @param isFlashOn  是否开启闪光灯
 */
- (void)setCameraFlash:(BOOL)isFlashOn API_UNAVAILABLE(macos);

/**
 设置预览镜像
 
 @param isMirrorOn  是否开启预览镜像
 */
- (void)setPreViewMirror:(BOOL)isMirrorOn ;

/**
 设置编码镜像
 
 @param isMirrorOn  是否开启编码镜像
 */
- (void)setCodeMirror:(BOOL)isMirrorOn API_UNAVAILABLE(macos);

/**
 设置对焦模式
 
 @param mode  对焦模式
 
 @return 是否设置成功
 */
- (BOOL)setFocusMode:(NIMNetCallFocusMode)mode API_UNAVAILABLE(macos);

/**
 获取摄像头支持的最大放大倍数
 
 *  @return 放大倍数
 */
- (CGFloat)getMaxZoomScale API_UNAVAILABLE(macos);

/**
 添加静态水印
 
 @param image  水印图片
 
 @param rect   水印具体位置和大小(x,y根据location位置,计算具体的位置信息)
 
 @param location  水印位置
 
 @return 是否设置成功
 */
- (BOOL)addWaterMark:(UIImage*)image
                rect:(CGRect)rect
            location:(NIMNetCallWaterMarkLocation)location API_UNAVAILABLE(macos);

/**
 添加动态水印
 
 @param imageArray 动态图像数组
 
 @param count 播放速度的快慢:count代表count帧显示同一张图
 
 @param looped 是否循环,不循环就显示一次
 
 @param rect 具体位置和大小(x,y根据location位置,计算具体的位置信息)
 
 @param location 位置
 
 @return 是否设置成功
 */
- (BOOL)addDynamicWaterMarks:(NSArray*)imageArray
                    fpsCount:(unsigned int)count
                        loop:(BOOL)looped
                        rect:(CGRect)rect
                    location:(NIMNetCallWaterMarkLocation)location API_UNAVAILABLE(macos);
/**
 *  清除水印
 */
- (void)cleanWaterMark API_UNAVAILABLE(macos);

/**
 手动对焦
 
 @param devicePoint 点
 */
- (void)changeNMCVideoPreViewManualFocusPoint:(CGPoint)devicePoint API_UNAVAILABLE(macos);

/**
 设置曝光兴趣点
 
 @param devicePoint 点
 */
-(void)changeNMCVideoExposurePointOfInterestPoint:(CGPoint)devicePoint API_UNAVAILABLE(macos);

/**
 设置对比度滤镜强度,支持自然 粉嫩 怀旧 黑白模式
 
 @param value 值 [0-4] 默认为 1
 
 @return 是否设置成功
 */
- (BOOL)setContrastFilterIntensity:(float)value API_UNAVAILABLE(macos);

/**
 设置磨皮滤镜强度,支持自然 粉嫩 怀旧 黑白模式
 
 @param value 值 [0-1] 默认为 0
 
 @return 是否设置成功
 */
- (BOOL)setSmoothFilterIntensity:(float)value API_UNAVAILABLE(macos);

@end

NS_ASSUME_NONNULL_END