# 高级媒体流管理

本文将介绍视频双录中高级媒体流管理的相关功能。

# 屏幕共享

屏幕共享可以让您和频道中的其他成员一起分享设备里的精彩内容,您可以在频道中利用屏幕共享的功能进行文档演示、在线教育演示、视频会议以及游戏过程分享等。

TIP

发起屏幕共享需要 iOS 11.0 及以上。目前 iOS 只支持应用内的屏幕共享。

开启或关闭屏幕共享接口 enableScreenShare (opens new window) 如下:

/**
 * @brief 开关屏幕共享
 * @param enable 是否开启屏幕共享
 * @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
-(bool)enableScreenShare:(bool)enable;

示例代码:

// 开启或关闭屏幕共享
[mediaChannel enableScreenShare:true];

您可以调用 JCMediaDevice 类中的 setScreenCaptureProperty (opens new window) 方法设置屏幕共享采集属性,包括采集的高度、宽度和帧速率。

/**
 *  @breif              设置屏幕共享采集属性
 *  @param width        采集宽度,默认640
 *  @param height       采集高度,默认360
 *  @param framerate    帧速率,默认10
 */
- (void)setScreenCaptureProperty:(int)width height:(int)height framerate:(int)framerate;

TIP

该方法可以在开启屏幕共享前调用,也可以在屏幕共享中调用;如果在屏幕共享中调用,则设置的采集属性要在下次屏幕共享开启时生效。

如果频道中有成员开启了屏幕共享,其他成员将收到 onMediaChannelPropertyChange (opens new window) 的回调,并通过 screenUserId (opens new window) 属性获得发起屏幕共享的用户标识。

/**
 *  @brief 属性变化回调,目前主要关注屏幕共享状态的更新
 *  @param changeParam 变化标识集合
 */
-(void)onMediaChannelPropertyChange:(JCMediaChannelPropChangeParam *)changeParam mediaChannel:(JCMediaChannel *)mediaChannel;

此时可以调用 requestScreenVideo (opens new window) 方法请求屏幕共享的视频流.

/**
 *  @brief               请求屏幕共享的视频流
 *  @param screenUri     屏幕分享uri
 *  @param pictureSize   视频请求尺寸类型
 *  @return              返回 true 表示正常执行调用流程,false 表示调用异常
 *  @see JCMediaChannelPictureSize
 *  @warning 当 pictureSize 为 JCMediaChannelPictureSizeNone 表示关闭请求
 */
-(bool)requestScreenVideo:(NSString*)screenUri pictureSize:(JCMediaChannelPictureSize)pictureSize;

示例代码:

-(void)onMediaChannelPropertyChange:(JCMediaChannelPropChangeParam *)changeParam mediaChannel:(JCMediaChannel *)mediaChannel{
    if(changeParam.screenShare){
        // 请求屏幕共享的视频流
        JCMediaDeviceVideoCanvas *screen = [mediaDevice startVideo:mediaChannel.screenRenderId renderType:JCMediaDeviceRenderFullContent];
        [mediaChannel requestScreenVideo:mediaChannel.screenRenderId pictureSize:JCMediaChannelPictureSizeLarge];
    }
}

# 服务器音视频录制

如果需要服务器进行音视频录制,在加入频道的时候选择是否开启远程录制。

JCMediaChannelJoinParam *param  = [[JCMediaChannelJoinParam alloc] init];
param.isEnableRemoteRecord = true;
[JCManager.shared.mediaChannel join:channelId joinParam:param];

录制参数设置好后,需要根据目前的录制状态来判断是否启音视频录制。其中录制状态可通过 recordState 属性获得。recordState (opens new window) 有:

/// 无法进行视频录制
JCMediaChannelRecordStateNone,
/// 可以开启视频录制
JCMediaChannelRecordStateReady,
/// 视频录制中
JCMediaChannelRecordStateRunning,

录制状态获取后,即可调用下面的接口开启或关闭音视频录制,录制状态改变会通过 onMediaChannelPropertyChange (opens new window) 回调中 propChangeParam.record = true上报

/**
 *  @brief 开关视频录制
 *  @param enable 是否开启屏幕录制
 *  @param recordParam 录制参数,当 enable 为 true 时,可以更改由 join 时传入的录制参数,不需更改则填 nil
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
- (bool)enableRemoteRecord:(bool)enable recordParam:(JCMediaChannelRecordRemoteParams *)recordParam;

其中,JCMediaChannelRecordRemoteParams 有以下属性

/**
 *  @brief 录制分辨率,参见 JCMediaChannelPictureSize
 */
@property (nonatomic, assign) JCMediaChannelPictureSize recordResolution;
/**
 *  @brief 录制帧率
 */
@property (nonatomic, assign) int frameRate;
/**
 *  @brief 媒体录制视频合并模式
 */
@property (nonatomic, assign) JCMediaChannelVideoMergeMode mergeMode;
/**
 *  @brief 视频的宽度
 */
@property (nonatomic, assign) int videoWidth;
/**
 *  @brief 视频的高度
 */
@property (nonatomic, assign) int videoHeight;
/**
 *  @brief 码率
 */
@property (nonatomic, assign) int iBitrate;
/**
 *  @brief 存储参数
 */
@property (nonatomic, copy) NSString *storage;
/**
 *  @brief 自定义文件名(Juphoon 文件服务)
 */
@property (nonatomic, copy) NSString *fileName;
/**
 *  @brief 自定义文件名(第三方)
 */
@property (nonatomic, copy) NSString *remoteFileName;

其中,视频合并模式(JCMediaChannelVideoMergeMode)有以下几种:

名称 描述
JCMediaChannelVideoMergeModeMergeScreen 平铺屏幕共享和所有视频
JCMediaChannelVideoMergeModeMergePlateForm 将屏幕共享和所有视频内容合并
JCMediaChannelVideoMergeModeMergeSpeaker 将屏幕共享和焦点视频内容合并
JCMediaChannelVideoMergeModeRealtimeVideo 只发送当前焦点视频
JCMediaChannelVideoMergeModeMergeIntellegenceLayout 智能分屏
JCMediaChannelVideoMergeModeScreenSharing 只发送屏幕共享

示例代码:

JCMediaChannelRecordRemoteParams *param = [[JCMediaChannelRecordRemoteParams alloc] init];
param.fileName = self.recordFileNameField.text;
param.mergeMode = JCMediaChannelVideoMergeModeMergeIntellegenceLayout;
[[JCManager shared].mediaChannel enableRemoteRecord:true recordParam:param];

# 本地音视频录制

/**
 * 本地会议录制
 * @param enable 开启或者关闭录制
 * @param recordParam 录制参数
 * @return 表示正常执行调用流程,false 表示调用异常
 */
 - (bool)enableLocalRecord:(bool)enable recordParam:(JCMediaChannelRecordLocalParams *)recordParam;

JCMediaChannelRecordLocalParams 有以下属性

@interface JCMediaChannelRecordLocalParams : NSObject

/**
 *  @brief 录制文件路径
 */
@property (nonatomic, copy) NSString *filePath;

/**
 *  @brief 是否录制音频
 */
@property (nonatomic, assign) bool recordAudio;

/**
 *  @brief 是否录制视频
 */
@property (nonatomic, assign) bool recordVideo;

/**
 *  @brief 录制是否包含自己
 */
@property (nonatomic, assign) bool recordSelf;

/**
 *  @brief 录制帧率
 */
@property (nonatomic, assign) int frameRate;

/**
 *  @brief 录制分辨率
 */
@property (nonatomic, assign) JCMediaChannelPictureSize recordResolution;

/**
 *  @brief 媒体录制视频合并模式
 */
@property (nonatomic, assign) JCMediaChannelVideoMergeMode mergeMode;

@end

其中,视频合并模式(JCMediaChannelVideoMergeMode) 与服务端录制相同。

示例代码:

//开启
JCMediaChannelRecordLocalParams *param = [[JCMediaChannelRecordLocalParams alloc] init];
param.filePath = "本地路径(自定义)";
param.mergeMode = JCMediaChannelVideoMergeModeMergeIntellegenceLayout;
[[JCManager shared].mediaChannel enableLocalRecord:true recordParam:param];

# IsVideo 属性

用于在视频会议中设置远程录制,

不论是录制视频还是录制音频,统一默认为录制视频。

示例代码:

//创建会议录制参数
JCMediaChannelRecordRemoteParams *param = [[JCMediaChannelRecordRemoteParams alloc] init];
//设置只录制音频
param.isVideo = false;
//传入会议录制参数,并开启录制
[_mediaChannel enableRemoteRecord:true recordParam:param];

# 单人录制(本地录制)

在旧版本中,用自助双录可以实现该功能,现独立出来,调用 JCMediaDevice.startFileRecordVideo (opens new window) 实现离线单人录制。

/// 开始离线录制(单人)
/// @param recordPath 生成的录制文件路径
/// @param cameraId cameraId
/// @param width 宽
/// @param height 高
- (bool)startFileRecordVideo:(NSString *)recordPath cameraId:(NSString *)cameraId width:(int)width height:(int)height;
/// 停止离线录制(单人)
/// @param cameraId cameraId
- (void)stopFileRecord:(NSString *)cameraId;

录制成功后通过 JCMediaDeviceCallback.onVideoCaptureDidStart (opens new window) 回调进行通知。

/**
 * 视频采集开始回调
 *
 * @param captureId 摄像头id
 */
- (void)onVideoCaptureDidStart:(NSString *)captureId;