合流配置
合流方法在 qiniu::QNRoomInterface
接口中定义;
- 开启服务端合流
服务端合流(旁路直播)配置信息,通过 SDK 信令将参数发送到服务端,服务端按照指定的参数进行合流并推出 RTMP 流;
// 自定义合流配置信息
struct MergeJob {
string job_id; // 合流任务 id,保证唯一
string publish_url; // 自定义合流推流地址
int width = 0; // 合流画布宽
int height = 0; // 合流画布高
int fps = 0; // 合流帧率
int bitrate = 0; // 合流码率 bps
int min_bitrate = 0; // 最小码率
int max_bitrate = 0; // 最大码率
bool is_hold_last_frame = false; //合流停止时是否保持最后一帧画面
MergeStretchMode stretch_mode = ASPECT_FILL;
};
struct MergeOptInfo
{
string track_id; // Track Id,房间内唯一
bool is_video; // 是否为视频类型,如果为 false, 则以下参数无效
int pos_x; // 此路流(即此 Track)在 RTMP 流画布中的 X 坐标
int pos_y; // 此路流(即此 Track)在 RTMP 流画布中的 Y 坐标
int pos_z; // 此路流(即此 Track)在 RTMP 流画布中的 Z 坐标
int width; // 此路流(即此 Track)在 RTMP 流画布中的宽度,缩放、裁减方式根据后端配置决定
int height; // 此路流(即此 Track)在 RTMP 流画布中的高度,缩放、裁减方式根据后端配置决定
MergeStretchMode stretchMode = ASPECT_INVALID; // 设置视频 Track 在合流时的填充模式,如果不做
// 单独设置,填充模式将继承 CreateMergeJob 的
// stretchMode
bool is_support_sei = false; // 是否支持私有 SEI 数据插入,只能设置一个 track 为 true
};
typedef list<MergeOptInfo> MergeOptInfoList;
// 创建自定义合流任务
// 当有合流及单路转推切换需求时,合流必须使用自定义合流,流地址一样时切换会有抢流现象,
// 因此需要拼接 "?serialnum=xxx" 决定流的优先级,serialnum 值越大,优先级越高。
// 切换成功后务必关闭之前的任务,否则会出现一路任务持续计费的情况
// @param job_desc: 合流任务配置结构
// @param merge_background: 合流背景图
// @param merge_watermark: 合流水印图
// @return 0:成功;其它请参考错误码列表
virtual int CreateMergeJob(
const MergeJob& job_desc,
const MergeLayer& merge_background,
const MergeLayerList& merge_watermark
) = 0;
// 配置各个 Track 的合流参数
// @param add_tracks_list_ 新增 Tracks 的合流配置
// @param remove_tracks_list 去除 Tracks 的合流配置,Tracks Id 链表
// @return 0:操作成功,具体合流结果可通过观看旁路直播进行查看
virtual int SetMergeStreamlayouts(
const MergeOptInfoList& add_tracks_list_,
const list<string>& remove_tracks_id_list
) = 0;
- 关闭服务端合流
virtual int StopMergeStream() = 0;
建议一个房间内同时只有一个用户可以控制服务端合流的配置,当此用户离开房间时,务必调用 StopMergeStream
取消合流操作,以免旁路推流(RTMP 流)出现黑屏现象。
有关服务端合流功能更详细的介绍,请参考链接:服务端合流