# 视频管理

视频管理模块的内容主要包括视频采集、视频渲染、渲染控制、视频数据管理以及视频设备的控制。您可以针对具体的场景进行灵活的设置。

视频模块涉及到以下两个类:

初始化 JCMediaDevice (opens new window)模块:

// 初始化各模块,因为这些模块实例将被频繁使用,建议声明在单例中
JCClient client = JCClient.create(Context, "your AppKey", this, null);
JCMediaDevice mediaDevice = JCMediaDevice.create(client, this);

# 视频采集设置

# 设置要开启的摄像头类型

视频采集前,可以指定要开启的摄像头,如前置摄像头或者后置摄像头,需要在调用 startCameraVideo (opens new window) 接口前调用。

首先获取摄像头列表:

/**
 *  @breif 指定要开启的摄像头
 *  @param camera 摄像头标识
 */
- (void)specifyCamera:(NSString *)camera;

camera 类型的值为下面几个常量。

# 设置摄像头采集分辨率

您可以通过自定义摄像头采集参数实现不同的视频分辨率,如采集的高度、宽度和帧速率。

摄像头采集属性设置接口如下,需要在调用 startCameraVideo (opens new window) 接口前调用。

/**
 *  @breif 设置摄像头采集属性
 *  @param width 采集宽度,默认640
 *  @param height 采集高度,默认360
 *  @param framerate 帧速率,默认30
 */
- (void)setCameraProperty:(int)width height:(int)height framerate:(int)framerate;

# 设置摄像头采集角度

如果想设置视频窗体与屏幕正方向的角度,需要在调用 startCameraVideo (opens new window) 接口前,通过 JCMediaDevice (opens new window) 类中的 videoAngle (opens new window) 属性设置

/**
 *  视频角度
 */
@property (nonatomic) JCMediaDeviceVideoAngel videoAngle;

videoAngle (opens new window) 设置之后,本端显示的远端视频画面会旋转设定的角度,同时对端显示的本地视频画面也会旋转设定的角度。

例如 A 设置旋转 90 度,则 B 看到的 A 的视频画面与屏幕正方向夹角为90度。 A 看到的 B 的视频画面与屏幕正方向夹角也为90度。如下图所示。

android1_3.png

VideoAngle (opens new window) 枚举值有:

JCMediaDeviceVideoAngelAuto = -1,
JCMediaDeviceVideoAngel0 = 0,
JCMediaDeviceVideoAngel90 = 90,
JCMediaDeviceVideoAngel180 = 180,
JCMediaDeviceVideoAngel270 = 270

# 设置 Canvas 旋转角度

如果想设置 Canvas 中画布的角度,需要调用 JCMediaDeviceVideoCanvas (opens new window) 类中的 rotate (opens new window) 接口。

/**
 * @brief 旋转角度,必须是90的倍数,该角度表示画面与屏幕正方向旋转后的夹角
 * @param angle 角度值
 */
-(void)rotate:(int)angle;

其中,角度需为 90 的倍数。调用该接口后,本端显示的本地视频画面和远端视频画面会同时旋转相同的角度,而对端显示的画面不受影响。

例如 A 设置旋转 90 度,则 A 端显示的 A 和 B 视频画面会同时旋转 90 度。而 B 端的视频画面则不会发生任何改变。如下图所示。

android1_4.png

示例代码:

// 设置要开启的摄像头类型
[mediaDevice specifyCamera:JCMediaDeviceCameraFront];

// 设置摄像头采集属性
[mediaDevice setCameraProperty:640 height:360 framerate:30];

// 设置摄像头采集角度
JCManager.shared.mediaDevice.videoAngle = 90;

# 视频渲染

# 创建本地和远端视频画面

1.本地视频渲染

本地视频渲染通过调用 startCameraVideo (opens new window) 接口获得本地视频对象用于 UI 界面显示,该接口会打开摄像头。

/**
 *  @brief 获得预览视频对象,通过此对象能获得视图用于UI显示
 *  @param type 渲染模式,@ref JCMediaDeviceRender
 *  @return JCMediaDeviceVideoCanvas 对象
 */
-(JCMediaDeviceVideoCanvas*)startCameraVideo:(JCMediaDeviceRender)type;

其中,渲染模式 JCMediaDeviceRender (opens new window) 有以下三种:

名称 描述
JCMediaDeviceRenderFullScreen 铺满窗口
JCMediaDeviceRenderFullContent 全图像显示,会有黑边,但在窗口跟图像比例相同的情况下不会有黑边
JCMediaDeviceRenderFullAuto 自适应

2.远端视频渲染

您可以调用 startVideo (opens new window) 方法获取对端视频对象并进行渲染。

/**
 *  @brief 获得预览视频对象,通过此对象能获得视图用于UI显示
 *  @param videoSource 渲染标识串,比如 JCMediaChannelParticipant JCCallItem 中的 renderId,当videoSource 为 videoFileId 时,内部会调用 startVideoFile
 *  @param type        渲染模式,@ref JCMediaDeviceRender
 *  @return JCMediaDeviceVideoCanvas 对象
 */
-(JCMediaDeviceVideoCanvas*)startVideo:(NSString*)videoSource renderType:(JCMediaDeviceRender)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*)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;
}

# 暂停渲染

如果想暂停画面的渲染可以调用如下接口。

/**
 *  @brief 暂停渲染
 *  @return 成功返回 true,失败返回 false
 */
-(void)pause;

# 恢复渲染

如果想对已暂停的画面继续进行渲染,可以调用下面的接口。

/**
 *  @brief 恢复渲染
 *  @return 成功返回 true,失败返回 false
 */
-(void)resume;

# 视频设备管理

# 获取摄像头列表

/**
 *  @brief 获取系统摄像头
 *  @return 摄像头
 */
- (NSArray<JCMediaDeviceCamera *> *)getCameras;

# 开启关闭摄像头

/**
 *  @breif 开启摄像头
 *  @return 成功返回 true,失败返回 false
 */
-(bool)startCamera;

/**
 *  @breif 关闭摄像头
 *  @return 成功返回 true,失败返回 false
 */
-(bool)stopCamera;

# 切换摄像头

/**
 *  @breif 切换摄像头,内部会根据当前摄像头类型来进行切换
 *  @return 成功返回 true,失败返回 false
 */
-(bool)switchCamera;

示例代码:

// 打开摄像头
[mediaDevice startCamera];
// 关闭摄像头
[mediaDevice stopCamera];
// 切换摄像头
[mediaDevice switchCamera];