# 视频管理
# 视频数据采集管理
# 设置要开启的摄像头类型
视频采集设置前,可以通过 JCMediaDevice 类中的属性获取摄像头列表、当前摄像头以及默认摄像头,具体如下:
/// 摄像头列表
NSArray<JCMediaDeviceCamera*> * __nonnull cameras;
/// 正在使用的摄像头
JCMediaDeviceCamera* __nullable camera;
/// 默认摄像头
JCMediaDeviceCamera* __nullable defaultCamera;
其中,摄像头对象(JCMediaDeviceCamera)有以下属性。
/// 摄像头id
NSString* __nonnull cameraId;
/// 摄像头名字
NSString* __nonnull cameraName;
/// 摄像头类型
JCMediaDeviceCameraType cameraType;
摄像头类型(JCMediaDeviceCameraType)有以下几种。
JCMediaDeviceCameraTypeNone = 0,
JCMediaDeviceCameraTypeFront = 1,
JCMediaDeviceCameraTypeBack = 2,
JCMediaDeviceCameraTypeUnknown = 3
摄像头列表获取后,可以调用下面的方法切换指定的摄像头。
/// 切换指定摄像头
/// @param camera 摄像头
-(bool)switchCamera:(JCMediaDeviceCamera* __nonnull)camera;
# 设置摄像头采集分辨率
您可以通过自定义摄像头采集参数实现不同的视频分辨率,如采集的高度、宽度和帧速率。
摄像头采集属性设置接口如下:
/**
* @breif 设置摄像头采集属性
* @param width 采集宽度,默认640
* @param height 采集高度,默认360
* @param framerate 帧速率,默认30
*/
- (void)setCameraProperty:(int)width height:(int)height framerate:(int)framerate;
示例代码
// 获取摄像头列表
NSArray<JCMediaDeviceCamera*> * cameras = mediaDevice.cameras;
// 设置要切换的摄像头
[mediaDevice switchCamera:cameras[1]];
// 设置摄像头采集属性
[mediaDevice setCameraProperty:640 height:360 framerate:30];
# 视频渲染管理
# 创建本地和远端视频画面
- 本地视频渲染
本地视频渲染通过调用 startCameraVideo 接口获得本地视频对象用于 UI 界面显示,该接口会打开摄像头 。
/**
* @brief 获得预览视频对象,通过此对象能获得视图用于UI显示
* @param type 渲染模式,@ref JCMediaDeviceRender
* @return JCMediaDeviceVideoCanvas 对象
*/
-(JCMediaDeviceVideoCanvas* __nullable)startCameraVideo:(int)type;
其中,渲染模式(JCMediaDeviceRender)有以下三种:
名称 | 描述 |
---|---|
JCMediaDeviceRenderFullScreen = 0 | 视频图像按比例填充整个渲染区域(裁剪掉超出渲染区域的部分区域) |
JCMediaDeviceRenderFullContent | 视频图像的内容完全呈现到渲染区域(可能会出现黑边,类似放电影的荧幕) |
JCMediaDeviceRenderFullAuto | 自动 |
- 远端视频渲染
您可以调用 startVideo 方法获取对端视频对象并进行渲染。
/**
* @brief 获得预览视频对象,通过此对象能获得视图用于UI显示
* @param videoSource 渲染标识串,比如 JCMediaChannelParticipant JCCallItem 中的 renderId,当videoSource 为 videoFileId 时,内部会调用 startVideoFile
* @param type 渲染模式,@ref JCMediaDeviceRender
* @return JCMediaDeviceVideoCanvas 对象
*/
-(JCMediaDeviceVideoCanvas* __nullable)startVideo:(NSString* __nonnull)videoSource renderType:(int)type;
示例代码
// 创建本地视频画面对象
JCMediaDeviceVideoCanvas *local = [mediaDevice startCameraVideo:JCMediaDeviceRenderFullContent];
local.videoView.frame = CGRectMake(0, 0, 100, 100);
[self.view addSubview:local.videoView];
// 创建远端视频画面对象,renderId来源于通话对象,一对一为JCCallItem对象,多方为JCMediaChannelParticipant对象
JCMediaDeviceVideoCanvas *remote = [mediaDevice startVideo:renderId renderType:JCMediaDeviceRenderFullContent];
remote.videoView.frame = CGRectMake(100, 0, 100, 100);
[self.view addSubview:remote.videoView];
# 销毁本地和远端视频画面
在视频通话结束或者视频通话中,如果想销毁视频画面,可以调用下面的接口。
/**
* @brief 停止视频
* @param canvas JCMediaDeviceVideoCanvas 对象,由 startVideo 获得
*/
-(void)stopVideo:(JCMediaDeviceVideoCanvas* __nonnull)canvas;
示例代码
JCMediaDeviceVideoCanvas *localCanvas = [mediaDevice startCameraVideo:JCMediaDeviceRenderFullContent];
JCMediaDeviceVideoCanvas *remoteCanvas = [mediaDevice startVideo:renderId renderType:JCMediaDeviceRenderFullContent];
if (localCanvas) {
// 移除本地视频
[mediaDevice stopVideo:localCanvas];
[localCanvas.videoView removeFromSuperview];
localCanvas = nil;
}
if (remoteCanvas) {
// 移除远端视频
[mediaDevice stopVideo:remoteCanvas];
[remoteCanvas.videoView removeFromSuperview];
remoteCanvas = nil;
}
渲染控制主要使用到 JCMediaDeviceVideoCanvas 类中的接口。具体如下:
# 更新视频渲染标识
如果想更新视频渲染标识,可以调用下面的接口。
/**
* @breif 更新视频渲染标识
* @param videoSource 视频源
* @return 成功返回 true,失败返回 false
*/
-(bool)replace:(NSString*)videoSource;
# 暂停渲染
如果想暂停画面的渲染可以调用如下接口。
/**
* @brief 暂停渲染
* @return 成功返回 true,失败返回 false
*/
-(void)pause;
# 恢复渲染
如果想对已暂停的画面继续进行渲染,可以调用下面的接口。
/**
* @brief 恢复渲染
* @return 成功返回 true,失败返回 false
*/
-(void)resume;
# 视频设备管理
视频设备管理主要用到 JCMediaDevice 类中的方法,具体如下:
# 开启关闭摄像头
/**
* @breif 开启摄像头,一般在只需开启摄像头时调用
* @return 成功返回 true,失败返回 false
*/
-(bool)startCamera;
/**
* @breif 关闭摄像头,一般和 startCamera 配对使用
* @return 成功返回 true,失败返回 false
*/
-(bool)stopCamera;
# 切换摄像头
/**
* @breif 切换前后摄像头,内部会根据当前摄像头类型来进行切换
* @return 成功返回 true,失败返回 false
*/
-(bool)switchCamera;
示例代码
// 打开摄像头
[mediaDevice startCamera];
// 关闭摄像头
[mediaDevice stopCamera];
// 切换摄像头
[mediaDevice switchCamera];