You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
781 lines
27 KiB
781 lines
27 KiB
// |
|
// JCMediaDevice.h |
|
// JCSDK-OC |
|
// |
|
// Created by maikireton on 2017/8/11. |
|
// Copyright © 2017年 juphoon. All rights reserved. |
|
// |
|
|
|
#import <Foundation/Foundation.h> |
|
#import "JCClient.h" |
|
#import "JCMediaDeviceVideoCanvas.h" |
|
#import "JCMediaDeviceCallback.h" |
|
#import "JCMediaDeviceConstants.h" |
|
|
|
/** |
|
* @defgroup 设备模块 |
|
* @{ |
|
* 用于管理媒体设备 |
|
*/ |
|
|
|
/** |
|
* 摄像头对象 |
|
*/ |
|
@interface JCMediaDeviceCamera : NSObject |
|
|
|
/** |
|
* 摄像头id |
|
*/ |
|
@property (nonatomic, readonly) NSString* __nonnull cameraId; |
|
|
|
/** |
|
* 摄像头名字 |
|
*/ |
|
@property (nonatomic, readonly) NSString* __nonnull cameraName; |
|
|
|
/** |
|
* 摄像头类型: |
|
* - @ref JCMediaDeviceCameraTypeNone : 未获取到摄像头 |
|
* - @ref JCMediaDeviceCameraTypeFront : 前置摄像头 |
|
* - @ref JCMediaDeviceCameraTypeBack : 后置摄像头 |
|
* - @ref JCMediaDeviceCameraTypeUnknown : 未知摄像头 |
|
*/ |
|
@property (nonatomic, readonly) JCMediaDeviceCameraType cameraType; |
|
|
|
@end |
|
|
|
/** |
|
* 音频设备对象,mac 使用 |
|
*/ |
|
@interface JCMediaDeviceAudio : NSObject |
|
|
|
/** |
|
* 音频设备id |
|
*/ |
|
@property (nonatomic, readonly) NSString* __nonnull audioId; |
|
|
|
/** |
|
* 音频设备名字 |
|
*/ |
|
@property (nonatomic, readonly) NSString* __nonnull audioName; |
|
|
|
/** |
|
* 输入还是输出设备 |
|
*/ |
|
@property (nonatomic, readonly) bool input; |
|
|
|
@end |
|
|
|
/** |
|
* 窗口对象,mac 使用 |
|
*/ |
|
@interface JCMediaDeviceWindow : NSObject |
|
|
|
/** |
|
* 窗口id |
|
*/ |
|
@property (nonatomic, readonly) NSString* __nonnull windowId; |
|
|
|
/** |
|
* 窗口名字 |
|
*/ |
|
@property (nonatomic, readonly) NSString* __nonnull windowName; |
|
|
|
@end |
|
|
|
/** |
|
* 设备音频参数 |
|
*/ |
|
@interface JCMediaDeviceAudioParam : NSObject |
|
|
|
/** |
|
* 音频输入采样率 |
|
* |
|
* 0 表示自动选择,手表等设备可以设置为 8000,默认值为 0 |
|
* |
|
* 不清楚如何选择音频采样率可不设置此参数,SDK将自动选择合适的音频采样率 |
|
*/ |
|
@property (nonatomic) int audioInputSamplingRate; |
|
|
|
/** |
|
* 音频输出采样率 |
|
* |
|
* 0 表示自动选择,手表等设备可以设置为 8000,默认值为 0 |
|
* |
|
* 不清楚如何选择音频采样率可不设置此参数,SDK将自动选择合适的音频采样率 |
|
*/ |
|
@property (nonatomic) int audioOutputSamplingRate; |
|
|
|
/** |
|
* 音频输入通道数量 |
|
* |
|
* 0 表示自动选择,0 和 1 表示单通道,>= 2 表示双通道,默认值为0 |
|
*/ |
|
@property (nonatomic) int audioInputChannelNumber; |
|
|
|
/** |
|
* 音频输出通道数量 |
|
* |
|
* 0 表示自动选择,0 和 1 表示单通道,>= 2 表示双通道,默认值为0 |
|
*/ |
|
@property (nonatomic) int audioOutputChannelNumber; |
|
|
|
/** |
|
* 是否自动打开音频输出设备 |
|
* |
|
* 建议在一对一通话开始前或者加入频道前进行设置,默认值为 true,表示自动打开 |
|
* |
|
* - true: 当一对一通话状态为连接中时或者自己加入频道成功时,SDK会自动打开音频输出设备 |
|
* - false: SDK 不会自动打开音频输出设备,建议在一对一通话状态为连接中时或者加入频道成功后,在子线程不断的调用 {@link JCMediaDevice.getAudioOutputData:length:sampleRateHz:channels: getAudioOutputData} 方法获取音频输出数据 |
|
*/ |
|
@property (nonatomic) bool autoStartAudioOutputDevice; |
|
|
|
/** |
|
* 是否自动打开音频输入设备 |
|
* |
|
* 建议在一对一通话开始前或者加入频道前进行设置,默认值为 true,表示自动打开 |
|
* |
|
* - true: 当一对一通话状态为连接中时或者自己加入频道成功时,SDK会自动打开音频输入设备 |
|
* - false: SDK 不会自动打开音频输入设备,建议在一对一通话状态为连接中时或者加入频道成功后,在子线程不断的调用 {@link JCMediaDevice.inputCustomAudioData:sampleRateHz:channels:playDelayMS:recDelayMS:clockDrift: inputCustomAudioData} 方法传入音频数据 |
|
*/ |
|
@property (nonatomic) bool autoStartAudioInputDevice; |
|
|
|
/** |
|
* 硬件AEC(回声消除)的开启状态 |
|
* |
|
* 默认是打开状态 |
|
* |
|
* - @ref JCMediaDeviceAudioAECTypeOn : 开启aec |
|
* - @ref JCMediaDeviceAudioAECTypeOff : 关闭aec |
|
* - @ref JCMediaDeviceAudioAECTypeAuto : 自动 |
|
*/ |
|
|
|
@property (nonatomic) JCMediaDeviceAudioAECType aecType; |
|
|
|
/** |
|
* 配置agc模式 默认开启 |
|
* - @ref JCMediaDeviceAudioAECTypeOn : 开启agc |
|
* - @ref JCMediaDeviceAudioAECTypeOff : 关闭agc |
|
* - @ref JCMediaDeviceAudioAECTypeAuto : 自动 |
|
*/ |
|
@property (nonatomic) JCMediaDeviceAudioAGCType agcMode; |
|
|
|
@end |
|
|
|
/** |
|
* 原始音频数据回调事件 |
|
*/ |
|
@protocol JCAudioFrameCallback <NSObject> |
|
|
|
/** |
|
* 获得采集的音频 |
|
* |
|
* @param inputId 输入源的自定义字符串 |
|
* @param sampleRateHz 输入源的采样频率 |
|
* @param channels 输入源的频道数量 |
|
* @param buf 该帧的采样数据 |
|
* @param playDelayMS 播放延时 |
|
* @param recDelayMS 采集延时 |
|
* @param clockDrift 时钟漂移 |
|
*/ |
|
- (void)onAudioInputFrame:(NSString *_Nonnull)inputId sampleRateHz:(int)sampleRateHz channels:(int)channels buf:(unsigned char *_Nonnull)buf playDelayMS:(int)playDelayMS recDelayMS:(int)recDelayMS clockDrift:(int)clockDrift; |
|
|
|
/** |
|
* 获得播放的声音 |
|
* |
|
* @param outputId 输出源的自定义字符串 |
|
* @param sampleRateHz 输出源的采集频率 |
|
* @param channels 输出源的采样通道数 |
|
* @param buf 该帧的采样数据 |
|
*/ |
|
- (void)onAudioOutputFrame:(NSString *_Nonnull)outputId sampleRateHz:(int)sampleRateHz channels:(int)channels buf:(unsigned char *_Nonnull)buf; |
|
|
|
@end |
|
|
|
/** |
|
* 原始视频数据回调事件 |
|
*/ |
|
@protocol JCVideoFrameCallback <NSObject> |
|
|
|
/** |
|
* 获得采集的视频 |
|
* |
|
* @param captureId 采集源id |
|
* @param face 镜头朝向 |
|
* - @ref JCMediaDeviceCameraType "JCMediaDeviceCameraTypeFront" 前置摄像头 |
|
* - @ref JCMediaDeviceCameraType "JCMediaDeviceCameraTypeBack" 后置摄像头 |
|
* @param imageAngle 图像正立所需角度 |
|
* @param captureOrient 镜头固定角度 |
|
* @param width 图像宽 |
|
* @param height 图像高 |
|
* @param buf 图像数据 |
|
*/ |
|
- (void)onVideoCaptureFrame:(NSString *_Nonnull)captureId face:(JCMediaDeviceCameraType)face imageAngle:(int)imageAngle captureOrient:(int)captureOrient width:(int*_Nonnull)width height:(int*_Nonnull)height buf:(unsigned char *_Nonnull)buf; |
|
|
|
/** |
|
* 获得播放的视频 |
|
* |
|
* @param renderId 渲染id |
|
* @param sourceType 视频源类型 |
|
* - @ref JCMediaDeviceVideoSource "JCMediaDeviceVideoSourcePeer" 用户 |
|
* - @ref JCMediaDeviceVideoSource "JCMediaDeviceVideoSourceCapture" 采集设备 |
|
* - @ref JCMediaDeviceVideoSource "JCMediaDeviceVideoSourceFile" 文件 |
|
* @param angle 图像正立所需角度 |
|
* @param mirror 镜像类型 |
|
* - @ref JCMediaDeviceMirror "JCMediaDeviceMirrorNone" 不镜像 |
|
* - @ref JCMediaDeviceMirror "JCMediaDeviceMirrorHorizontal" 水平方向镜像 |
|
* - @ref JCMediaDeviceMirror "JCMediaDeviceMirrorVertical" 竖直方向镜像 |
|
* - @ref JCMediaDeviceMirror "JCMediaDeviceMirrorAuto" 自动选择 |
|
* - @ref JCMediaDeviceMirror "JCMediaDeviceMirrorFromLeft" 转场动画,从左侧翻转 |
|
* - @ref JCMediaDeviceMirror "JCMediaDeviceMirrorFromTop" 转场动画,从上侧翻转 |
|
* @param width 图像宽 |
|
* @param height 图像高 |
|
* @param buf 图像数据 |
|
* @param timeStamp 渲染时间戳 |
|
*/ |
|
- (void)onVideoRenderFrame:(NSString *_Nonnull)renderId sourceType:(JCMediaDeviceVideoSource)sourceType angle:(int)angle mirror:(JCMediaDeviceMirror)mirror width:(int*_Nonnull)width height:(int*_Nonnull)height buf:(unsigned char *_Nonnull)buf timeStamp:(unsigned long)timeStamp; |
|
|
|
@end |
|
|
|
/** |
|
* 设备模块 |
|
* @note 扬声器通过 JCMediaDevice 类中 {@link enableSpeaker: enableSpeaker} 进行开关 |
|
*/ |
|
@interface JCMediaDevice : NSObject |
|
|
|
/** |
|
* 摄像头是否已打开 |
|
* - true: 已打开 |
|
* - false: 未打开 |
|
*/ |
|
@property (nonatomic, readonly) bool cameraOpen; |
|
|
|
/** |
|
* 文件播放是否打开 |
|
* - true: 已打开文件播放 |
|
* - false: 未打开文件播放 |
|
*/ |
|
@property (nonatomic, readonly) bool videoFileOpen; |
|
|
|
/** |
|
* 当前使用的摄像头 |
|
*/ |
|
@property (nonatomic, strong, readonly) JCMediaDeviceCamera* __nullable camera; |
|
|
|
/** |
|
* 摄像头列表 |
|
*/ |
|
@property (nonatomic, readonly) NSArray<JCMediaDeviceCamera*> * __nonnull cameras; |
|
|
|
/** |
|
* 默认摄像头 |
|
*/ |
|
@property (nonatomic, strong) JCMediaDeviceCamera* __nullable defaultCamera; |
|
|
|
/** |
|
* 音频参数 |
|
* |
|
* 此参数不设置,将使用默认值。此参数在调用 {@link startAudio} 方法前设置,即连接通话或加入频道前设置此参数 |
|
*/ |
|
@property (nonatomic, strong) JCMediaDeviceAudioParam * _Nonnull audioParam; |
|
|
|
/** |
|
* 视频文件作为本地视频源的渲染标识 |
|
*/ |
|
@property (nonatomic, strong, readonly) NSString* __nonnull videoFileId; |
|
|
|
/** |
|
* 是否声音被中断 |
|
*/ |
|
@property (nonatomic, readonly) bool audioInterrupt; |
|
|
|
/** |
|
* 视频渲染窗体角度 |
|
* |
|
* - @ref JCMediaDeviceVideoAngelAuto : 自动 |
|
* - @ref JCMediaDeviceVideoAngel0 : 0° |
|
* - @ref JCMediaDeviceVideoAngel90 : 90° |
|
* - @ref JCMediaDeviceVideoAngel180 : 180° |
|
* - @ref JCMediaDeviceVideoAngel270 : 270° |
|
*/ |
|
@property (nonatomic) JCMediaDeviceVideoAngel videoAngle; |
|
|
|
/** |
|
* 是否使用内部音频设备逻辑 |
|
* 内部音频设备逻辑如下:<br> |
|
* 1.打开扬声器 - 使用扬声器输出声音 <br> |
|
* 2.连上蓝牙耳机 - 使用蓝牙耳机输出声音,如果扬声器开着则关闭扬声器 <br> |
|
* 3.插入耳机 - 使用耳机输出声音,如果扬声器开着则关闭扬声器 <br> |
|
* 4.蓝牙耳机和有线耳机以最后连上的作为输出 <br> |
|
* 5.关闭扬声器 - (蓝牙耳机或有线耳机) 优于 听筒 <br> |
|
* |
|
* - true: 使用内部音频设备逻辑 |
|
* - false: 不使用内部音频设备逻辑 |
|
*/ |
|
@property (nonatomic) bool useInternalAudioDeviceLogic; |
|
|
|
/** |
|
* 音频是否启动 |
|
* |
|
* 一般正式开启通话前需要调用此接口 |
|
* |
|
* - true:调用成功 |
|
* - false:调用失败 |
|
*/ |
|
@property (nonatomic, readonly) bool audioStart; |
|
|
|
#if TARGET_OS_OSX |
|
/** |
|
* 音频输入设备列表,mac 使用 |
|
*/ |
|
@property (nonatomic, readonly) NSArray<JCMediaDeviceAudio*>* __nonnull audioInputs; |
|
|
|
/** |
|
* 当前音频输入设备,mac 使用 |
|
*/ |
|
@property (nonatomic, strong) JCMediaDeviceAudio* __nullable audioInput; |
|
|
|
/** |
|
* 音频输出设备列表,mac 使用 |
|
*/ |
|
@property (nonatomic, readonly) NSArray<JCMediaDeviceAudio*>* __nonnull audioOutputs; |
|
|
|
/** |
|
* 当前音频输出设备,mac 使用 |
|
*/ |
|
@property (nonatomic, strong) JCMediaDeviceAudio* __nullable audioOutput; |
|
|
|
/** |
|
* 桌面列表,mac 使用 |
|
*/ |
|
@property (nonatomic, readonly) NSArray<JCMediaDeviceWindow*>* __nonnull desktops; |
|
|
|
/** |
|
* 窗口列表,mac 使用 |
|
*/ |
|
@property (nonatomic, readonly) NSArray<JCMediaDeviceWindow*>* __nonnull windows; |
|
|
|
/** |
|
* 屏幕分享的窗口,mac 使用 |
|
*/ |
|
@property (nonatomic, strong) JCMediaDeviceWindow* __nullable screenshareWindow; |
|
#endif |
|
|
|
/** |
|
* 创建 JCMediaDevice 对象 |
|
* |
|
* JCMediaDevice 的所有接口函数,如无特殊说明,都建议在主线程调用 |
|
* |
|
* @note |
|
* - 调用此方法创建 JCMediaDevice 对象后,期间没有调用过 {@link destroy destroy} 方法销毁对象,然后又重复调用此方法,会直接返回第一次创建的 JCMediaDevice 对象 |
|
* - 调用此方法前确保 JCClient 已完成初始化,即 @ref JCClient.state "state" 状态值不等于 @ref JCClientStateNotInit |
|
* |
|
* @param client JCClient 对象 |
|
* @param callback JCMediaDeviceCallback 对象,用于回调相关通知 |
|
* @return JCMediaDevice 对象 |
|
* @exception "JCClient、JCMediaDeviceCallback 任意一个参数传空就会调用失败" |
|
*/ |
|
+(JCMediaDevice* __nullable)create:(JCClient* __nonnull)client callback:(id<JCMediaDeviceCallback> __nonnull)callback; |
|
|
|
/** |
|
* 销毁 JCMediaDevice 对象 |
|
* |
|
* 该方法为同步调用,需要等待 JCMediaDevice 实例资源释放后才能执行其他操作,调用此方法后,你将无法再使用 JCMediaDevice 的其它方法和回调。<br> |
|
* 我们 **不建议** 在 JCSDK 的回调中调用此方法销毁 JCMediaDevice 对象,否则会出现崩溃。<br> |
|
* 如需在销毁后再次创建 JCMediaDevice 实例,需要等待 @ref destroy 方法执行结束后再创建实例。 |
|
*/ |
|
+(void)destroy; |
|
|
|
/** |
|
* 开始自身视频渲染 |
|
* |
|
* 获取本端视频预览对象 JCMediaDeviceVideoCanvas,通过此对象能获得视图用于UI显示 |
|
* |
|
* 一对一通话建议使用 {@link JCCallItem.startSelfVideo: startSelfVideo} 方法代替,多方通话建议使用 {@link JCMediaChannelParticipant.startVideo:pictureSize: startVideo} 方法代替 |
|
* |
|
* @note 调用此方法时需要保证默认摄像头不为空,即 @ref defaultCamera 不为空,否则将直接返回 nil |
|
* |
|
* @param type 渲染模式: |
|
* - @ref JCMediaDeviceRenderFullScreen : 铺满窗口,会有裁剪 |
|
* - @ref JCMediaDeviceRenderFullContent : 全图像显示,会有黑边 |
|
* - @ref JCMediaDeviceRenderFullAuto : 自适应 |
|
* @return |
|
* - JCMediaDeviceVideoCanvas 对象:开始自身视频渲染成功 |
|
* - nil:开始自身视频渲染失败 |
|
*/ |
|
-(JCMediaDeviceVideoCanvas* __nullable)startCameraVideo:(JCMediaDeviceRender)type; |
|
|
|
/** |
|
* 开始自身视频渲染 |
|
* |
|
* 获取本端视频预览对象 JCMediaDeviceVideoCanvas,通过此对象能获得视图用于UI显示 |
|
* |
|
* 一对一通话建议使用 {@link JCCallItem#startSelfVideo: startSelfVideo} 方法代替,多方通话建议使用 {@link JCMediaChannelParticipant#startVideo:pictureSize: startVideo} 方法代替 |
|
* |
|
* @note 调用此方法时需要保证默认摄像头不为空,即 @ref defaultCamera 不为空,否则将直接返回 nil |
|
* |
|
* @param type 渲染模式: |
|
* - @ref JCMediaDeviceRenderFullScreen : 铺满窗口,会有裁剪 |
|
* - @ref JCMediaDeviceRenderFullContent : 全图像显示,会有黑边 |
|
* - @ref JCMediaDeviceRenderFullAuto : 自适应 |
|
* @param view 渲染视图 |
|
* @return |
|
* - JCMediaDeviceVideoCanvas 对象:开始自身视频渲染成功 |
|
* - nil:开始自身视频渲染失败 |
|
*/ |
|
-(JCMediaDeviceVideoCanvas* __nullable)startCameraVideo:(JCMediaDeviceRender)type view:(JCView* __nonnull)view; |
|
|
|
/** |
|
* 开始其他端的视频渲染 |
|
* |
|
* 获取其他端的视频预览对象 JCMediaDeviceVideoCanvas,通过此对象能获得视图用于UI显示 |
|
* |
|
* 一对一通话建议使用 {@link JCCallItem#startOtherVideo: startOtherVideo} 方法代替,多方通话建议使用 {@link JCMediaChannelParticipant#startVideo:pictureSize: startVideo} 方法代替 |
|
* |
|
* @param videoSource 渲染标识串,通过 JCMediaChannelParticipant 的 @ref JCMediaChannelParticipant.renderId "renderId" 方法和 JCCallItem 的 @ref JCCallItem.renderId "renderId" 方法可以得到 |
|
* @param type 渲染模式: |
|
* - @ref JCMediaDeviceRenderFullScreen : 铺满窗口,会有裁剪 |
|
* - @ref JCMediaDeviceRenderFullContent : 全图像显示,会有黑边 |
|
* - @ref JCMediaDeviceRenderFullAuto : 自适应 |
|
* @return |
|
* - JCMediaDeviceVideoCanvas 对象:开始自身视频渲染成功 |
|
* - nil:开始自身视频渲染失败 |
|
*/ |
|
-(JCMediaDeviceVideoCanvas* __nullable)startVideo:(NSString* __nonnull)videoSource renderType:(JCMediaDeviceRender)type; |
|
|
|
/** |
|
* 开始其他端的视频渲染 |
|
* |
|
* 获取其他端的视频预览对象 JCMediaDeviceVideoCanvas,通过此对象能获得视图用于UI显示 |
|
* |
|
* 一对一通话建议使用 {@link JCCallItem#startOtherVideo: startOtherVideo} 方法代替,多方通话建议使用 {@link JCMediaChannelParticipant.startVideo:pictureSize: startVideo} 方法代替 |
|
* |
|
* @param videoSource 渲染标识串,通过 JCMediaChannelParticipant 的 @ref JCMediaChannelParticipant.renderId "renderId" 方法和 JCCallItem 的 @ref JCCallItem.renderId "renderId" 方法可以得到 |
|
* @param type 渲染模式: |
|
* - @ref JCMediaDeviceRenderFullScreen : 铺满窗口 |
|
* - @ref JCMediaDeviceRenderFullContent : 全图像显示,会有黑边 |
|
* - @ref JCMediaDeviceRenderFullAuto : 自适应 |
|
* @param view 渲染视图 |
|
* @return JCMediaDeviceVideoCanvas 对象 |
|
*/ |
|
-(JCMediaDeviceVideoCanvas* __nullable)startVideo:(NSString* __nonnull)videoSource renderType:(JCMediaDeviceRender)type view:(JCView* __nonnull)view; |
|
|
|
/** |
|
* 停止视频渲染 |
|
* |
|
* 一对一通话建议使用 {@link JCCallItem#stopSelfVideo stopSelfVideo} 和 {@link JCCallItem#stopOtherVideo stopOtherVideo} 方法代替,多方通话渲染建议使用 {@link JCMediaChannelParticipant#stopVideo stopVideo} 方法代替 |
|
* |
|
* @param canvas JCMediaDeviceVideoCanvas 对象,由 {@link startVideo:renderType: startVideo} 或 {@link startCameraVideo: startCameraVideo} 返回 |
|
*/ |
|
-(void)stopVideo:(JCMediaDeviceVideoCanvas* __nonnull)canvas; |
|
|
|
/** |
|
* 启动音频 |
|
* |
|
* 在通话连接中或者加入频道成功时,SDK内部会自动调用此方法来启动音频,上层无需再调用此方法 |
|
* |
|
* @return 调用是否成功 |
|
* - true:调用成功 |
|
* - false:调用失败 |
|
*/ |
|
-(bool)startAudio; |
|
|
|
/** |
|
* 停止音频 |
|
* |
|
* 在通话挂断时或者离开频道时,SDK内部会自动调用此方法来停止音频,上层无需再调用此方法 |
|
* |
|
* @return 调用是否成功 |
|
* - true:调用成功 |
|
* - false:调用失败 |
|
*/ |
|
-(bool)stopAudio; |
|
|
|
/** |
|
* 开启摄像头 |
|
* |
|
* @note 调用此方法时需要保证默认摄像头不为空,即 @ref defaultCamera 不为空,否则将直接返回 false |
|
* |
|
* @return 调用是否成功 |
|
* - true:正常执行调用流程 |
|
* - 若调用此方法前摄像头已打开,不会收到回调通知 |
|
* - 若调用此方法前摄像头未打开,会收到 {@link JCMediaDeviceCallback#onCameraUpdate onCameraUpdate} 通知 |
|
* - false:调用失败 |
|
*/ |
|
-(bool)startCamera; |
|
|
|
/** |
|
* 关闭摄像头 |
|
* |
|
* @return 调用是否成功 |
|
* - true:正常执行调用流程 |
|
* - 调用此方法前摄像头已打开,不会收到回调通知 |
|
* - 调用此方法前摄像头未打开,会收到 {@link JCMediaDeviceCallback#onCameraUpdate onCameraUpdate} 通知 |
|
* - false:调用失败 |
|
*/ |
|
-(bool)stopCamera; |
|
|
|
/** |
|
* 切换摄像头 |
|
* |
|
* 内部会根据当前摄像头类型来进行切换 |
|
* |
|
* - 调用此方法时要保证摄像头已打开,否则将直接返回 false |
|
* - 设备拥有两个以上摄像头,否则将直接返回 true |
|
* - 满足以上两个条件后,内部会调用 {@link switchCamera: switchCamera:(JCMediaDeviceCamera *)camera} 方法并提供返回值 |
|
* |
|
* @return 调用是否成功 |
|
* - true:调用成功 |
|
* - false:调用失败 |
|
*/ |
|
-(bool)switchCamera; |
|
|
|
/** |
|
* 切换摄像头 |
|
* |
|
* 调用此方法时需要保证摄像头已打开并且摄像头数大于0,否则将直接返回 false |
|
* |
|
* @param camera 摄像头 |
|
* @return 调用是否成功 |
|
* - true:正常执行调用流程 |
|
* - 摄像头个数为1,不会收到回调 |
|
* - 摄像头个数大于1,会收到 {@link JCMediaDeviceCallback#onCameraUpdate onCameraUpdate} 通知 |
|
* - false:调用失败,不会收到回调 |
|
*/ |
|
-(bool)switchCamera:(JCMediaDeviceCamera* __nonnull)camera; |
|
|
|
/** |
|
* 设置摄像头采集属性 |
|
* |
|
* 在调用 {@link JCCallItem#startSelfVideo: startSelfVideo} 方法或 {@link JCMediaChannelParticipant#startVideo:pictureSize: startVideo} 方法开启自身视频渲染前设置即可生效 |
|
* |
|
* @param width 采集宽度,默认640 |
|
* @param height 采集高度,默认360 |
|
* @param frameRate 采集帧速率,默认24 |
|
*/ |
|
- (void)setCameraProperty:(int)width height:(int)height framerate:(int)framerate; |
|
|
|
/** |
|
* 设置屏幕共享采集属性 |
|
* |
|
* 在调用 {@link JCMediaChannel#enableScreenShare: enableScreenShare} 方法开启屏幕共享前设置即可生效 |
|
* |
|
* @param width 采集宽度,默认1280 |
|
* @param height 采集高度,默认720 |
|
* @param frameRate 采集帧速率,默认10 |
|
*/ |
|
- (void)setScreenCaptureProperty:(int)width height:(int)height framerate:(int)framerate; |
|
|
|
/** |
|
* 开启视频文件作为视频输入源 |
|
* |
|
* @note |
|
* - 加入会议前或者一对一通话接听前调用 |
|
* - 文件和摄像头作为视频输入源只能存在一种,如果当前摄像头已开启的话会关闭摄像头 |
|
* |
|
* @return 调用是否成功 |
|
* - true:正常执行调用流程 |
|
* - 若调用此方法时文件视频源已开启,则不会收到回调 |
|
* - 若调用此方法时文件视频源还未开启,则会收到 {@link JCMediaDeviceCallback#onCameraUpdate onCameraUpdate} 回调 |
|
* - false:调用失败,不会收到回调 |
|
*/ |
|
-(bool)startVideoFile; |
|
|
|
/** |
|
* 逐帧采集视频画面 |
|
* |
|
* 调用此方法时要保证文件视频源已开启 |
|
* |
|
* @note 当 format 为 H264 格式并且是关键帧时: |
|
* - 第一帧一定要包含关键帧,并且需要将 0x67 0x68 0x65 的数据作为完整一帧传入,其中0x67,0x68为pps,0x65为关键帧标识 |
|
* - 后续P帧以 0x41 数据形式传入 |
|
* - 关键帧要以固定间隔传入,例如5秒,否则一开始可能有几秒对端无法显示视频 |
|
* |
|
* @param data 画面二进制数据 |
|
* @param format @ref JCMediaDeviceVideoPixelFormat "视频像素格式" |
|
* @param width 宽 |
|
* @param height 高 |
|
*/ |
|
-(void)setVideoFileFrame:(NSData* __nonnull)srcFrame format:(JCMediaDeviceVideoPixelFormat)format width:(int)width height:(int)height; |
|
|
|
/** |
|
* 向文件视频源逐帧添加视频数据 |
|
* |
|
* 调用此方法时要保证文件视频源已开启 |
|
* |
|
* @note 当 format 为 H264 格式并且是关键帧时: |
|
* - 第一帧一定要包含关键帧,并且需要将 0x67 0x68 0x65 的数据作为完整一帧传入,其中0x67,0x68为pps,0x65为关键帧标识 |
|
* - 后续P帧以 0x41 数据形式传入 |
|
* - 关键帧要以固定间隔传入,例如5秒,否则一开始可能有几秒对端无法显示视频 |
|
* |
|
* @param srcFrame 视频数据 |
|
* @param angle 角度, 为 90 的倍数 |
|
* @param mirror 是否镜像,0 不镜像,1 镜像 |
|
*/ |
|
-(void)setVideoFileFrame:(CVPixelBufferRef __nonnull)srcFrame angle:(int)angle mirror:(int)mirror; |
|
|
|
/** |
|
* 关闭逐帧采集画面 |
|
* |
|
* @return 调用是否成功 |
|
* - true:正常执行调用流程 |
|
* - 若调用此方法时文件视频源已关闭,不会收到回调 |
|
* - 若调用此方法时文件视频源未关闭,则会收到 {@link JCMediaDeviceCallback#onCameraUpdate onCameraUpdate} 回调 |
|
* - false:调用失败 |
|
*/ |
|
-(bool)stopVideoFile; |
|
|
|
/** |
|
* 获取摄像头曝光补偿最大最小值,单位EV |
|
* |
|
* @return 最小曝光补偿: |
|
*/ |
|
-(int)getMinExposureCompensation; |
|
|
|
/** |
|
* 获取摄像头曝光补偿最大最小值,单位EV |
|
* |
|
* @return 最大曝光补偿: |
|
*/ |
|
-(int)getMaxExposureCompensation; |
|
|
|
/** |
|
* 获取摄像头曝光补偿步长 |
|
* |
|
* @return 获取曝光补偿步长: |
|
*/ |
|
-(float)getExposureCompensationStep; |
|
|
|
/** |
|
* 设置摄像头曝光补偿 |
|
* |
|
* @return 返回使用结果 |
|
*/ |
|
|
|
-(int)setExposureCompensation:(float)exposureValue; |
|
|
|
|
|
/** |
|
* 设置摄像头变焦 |
|
* |
|
* @return 返回使用结果 |
|
*/ |
|
|
|
-(int)setCameraZoom:(float)zoom; |
|
|
|
/** |
|
* 查询摄像头是否支持闪光灯 |
|
* |
|
* @return 是否支持闪光灯: |
|
*/ |
|
-(bool)isCameraFlashSupported; |
|
|
|
/** |
|
* 是否使用闪光灯 |
|
* |
|
* @return 返回使用结果 |
|
*/ |
|
-(bool)enableFlash:(bool)enable; |
|
|
|
|
|
#pragma mark - 音频数据管理 |
|
|
|
/** |
|
* 注册语音观测器对象。 |
|
* |
|
* 该方法用于注册语音观测器对象,即注册回调。当需要 SDK 给出 {@link JCAudioFrameCallback.onAudioInputFrame:sampleRateHz:channels:buf:playDelayMS:recDelayMS:clockDrift: onAudioInputFrame} |
|
* 或 {@link JCAudioFrameCallback.onAudioOutputFrame:sampleRateHz:channels:buf: onAudioOutputFrame} 回调时,需要使用该方法注册回调。 该方法需要在加入频道前或开始通话前调用。 |
|
* |
|
* @param callback 实现 JCAudioFrameCallback 协议的对象。传入 nil 表示取消注册。我们建议在收到 {@link JCMediaChannelCallback.onLeave:channelId: onLeave} 或 {@link JCMediaChannelCallback.onStop:reason: onStop} 或 {@link JCCallCallback.onCallItemRemove:reason:description: onCallItemRemove} 后调用,来释放语音观测器对象。 |
|
*/ |
|
- (void)registerAudioFrameCallback:(id<JCAudioFrameCallback> __nullable)callback; |
|
|
|
/** |
|
* 注册视频观测器对象。 |
|
* |
|
* 该方法用于注册视频观测器对象,即注册回调。当需要 SDK 给出 {@link JCVideoFrameCallback.onVideoCaptureFrame:face:imageAngle:captureOrient:width:height:buf: onVideoCaptureFrame} |
|
* 或 {@link JCVideoFrameCallback.onVideoRenderFrame:sourceType:angle:mirror:width:height:buf:timeStamp: onVideoRenderFrame} 回调时,需要使用该方法注册回调。 该方法需要在加入频道前或开始通话前调用。 |
|
* |
|
* @param callback JCVideoFrameCallback 对象。传入 nil 表示取消注册。我们建议在收到 {@link JCMediaChannelCallback.onLeave:channelId: onLeave} 或 {@link JCMediaChannelCallback.onStop:reason: onStop} 或 {@link JCCallCallback.onCallItemRemove:reason:description: onCallItemRemove} 后调用,来释放语音观测器对象。 |
|
* |
|
* @return 是否正常调用 |
|
* - true: 正常执行调用流程 |
|
* - false: 调用失败 |
|
*/ |
|
- (void)registerVideoFrameCallback:(id<JCVideoFrameCallback> __nullable)callback; |
|
|
|
/** |
|
* 将音频输入数据输入到媒体层 |
|
* 当 @ref JCMediaDeviceAudioParam.autoStartAudioInputDevice "autoStartAudioInputDevice" 为 false 时才可以将音频输入数据输入到媒体层 |
|
* 建议在一对一通话状态为连接中时或者加入频道成功后,在子线程不断的调用此方法传入音频数据 |
|
* |
|
* @param data 外部采集数据源,需要传入 NSData 对象 |
|
* @param sampleRateHz 外部输入源的采样频率,取值范围:8000,16000,32000,44100,48000 |
|
* @param channels 外部输入源的采样通道数,取值范围:1或2 |
|
* @param playDelayMS 播放延时 一般设为0 |
|
* @param recDelayMS 采集延时 一般设为0 |
|
* @param clockDrift 时钟漂移 一般设为0 |
|
* |
|
* @return 是否正常调用 |
|
* - true: 正常执行调用流程 |
|
* - false: 调用失败 |
|
*/ |
|
- (bool)inputCustomAudioData:(NSData *_Nonnull)data sampleRateHz:(int)sampleRateHz channels:(int)channels playDelayMS:(int)playDelayMS recDelayMS:(int)recDelayMS clockDrift:(int)clockDrift; |
|
|
|
/** |
|
* 获取音频输出数据 |
|
* |
|
* 当 @ref JCMediaDeviceAudioParam.autoStartAudioOutputDevice "autoStartAudioOutputDevice" 为 false 时才可以获取到音频输出数据 |
|
* 建议在一对一通话状态为连接中时或者加入频道成功后,在子线程不断的调用此方法获取音频输出数据 |
|
* |
|
* @param buf 字节缓冲区,从媒体层获取的音频输出数据将被存入此缓冲区,需要传入 unsigned char* 对象。缓冲区的容量为(采样频率*采样通道数/100) |
|
* @param sampleRateHz 输出源的采集频率,取值范围:8000,16000,32000,44100,48000 |
|
* @param channels 输出源的采样通道数,取值范围:1或2 |
|
* @param length 音频输出数据的字节长度,即 buf 参数的字节长度 |
|
* |
|
* @return 是否正常调用 |
|
* - true: 正常执行调用流程 |
|
* - false: 调用失败 |
|
*/ |
|
- (bool)getAudioOutputData:(unsigned char*_Nonnull)buf length:(int)length sampleRateHz:(int)sampleRateHz channels:(int)channels; |
|
|
|
|
|
#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR |
|
|
|
/** |
|
* 没有插入耳机或外接蓝牙时是否默认开启扬声器,默认关闭,iOS 使用 |
|
* - true 默认开启 |
|
* - false 默认不开启 |
|
*/ |
|
@property (nonatomic) bool defaultSpeakerOn; |
|
|
|
/** |
|
* 开启/关闭扬声器,iOS 使用 |
|
* |
|
* 只有在音频已经启动的情况下调用才会生效 |
|
* |
|
* @param enable 开启或者关闭扬声器 |
|
* - true: 开启 |
|
* - false: 关闭 |
|
*/ |
|
-(void)enableSpeaker:(bool)enable; |
|
|
|
/** |
|
* 获得当前音频模式,目前只支持听筒和扬声器,iOS 使用 |
|
* @return 音频模式 |
|
*/ |
|
-(NSString* __nullable)getAudioOutputType; |
|
|
|
/** |
|
* 扬声器是否已打开,iOS 使用 |
|
* - true: 已打开 |
|
* - false: 未打开 |
|
*/ |
|
-(bool)isSpeakerOn; |
|
|
|
#endif |
|
@end |
|
|
|
/** |
|
* @} |
|
*/
|
|
|