每每到618、双11这样的大型活动的时候,每天都有几个重要的大v或者品牌直播需要保障。
以往的重点场次监播方式是这么造的:
对每路直播的源流、各档转码流分别起一个ffplay播放窗口,再手动调整尺寸在显示器桌面进行布局,排到一屏里来监播。
这样做的缺点:
展示方式是这样的:
ffplay 'rtmp://stream1' & ffplay 'rtmp://stream2' & ffplay 'rtmp://stream3' & ffplay 'rtmp:/stream4' & ffplay 'rtmp://stream5' & ffplay 'rtmp://stream6' & ffplay 'rtmp://stream7' & ffplay 'rtmp://stream8'
![]()
![]()
PS:这么多的窗口,点着是挺麻烦的😓
在我们混流生产层能力完备后,就开始琢磨怎么将它赋能在平常或者大促的直播间重保上,同时也为了更加专业、更高效的进行监播,经过了一段时间的打磨,提炼了一个简单的混流编排功能。
它的工作模式是这样的:
在这里你可以创建混流任务,并支持你在不断流的状态下做到更新任务输入信息。
将要监播的直播流地址,需要展示的文字内容、布局方式、混流输出的模板配置进行下发,就可以拉到自动编排好的直播流地址。
它现在长这个样子:
![]()
![]()
最终呈现出来的混流的效果是这样的😁:
![]()
也可以是这样的:
![]()
也可以呈现其他的布局方式,目前还没做的那么丰富,不过底层能力和api接口是都支持的,完全灵活布局。
在混流任务运行过程中,可以自由修改混流输入源的配置。
这种新型的监播方式,可以直观的区分源流、各档转码流的播放效果:画面内容是否正常,有无花屏、是否卡顿?
当出现问题时能够指导我们快速做出决策:
还有其他的一些有点:
-
操作简单方便,还可以记忆配置,下次直接修改
-
每个播放端只需拉一路流,节省本地带宽
-
最多可以支持16路混流,一屏监播16路流的画面
-
不断流,轻松切换各种布局
-
不断流,随便操作流的添加、删除、修改
-
方便分享给其他人进行播放
混流布局功能的底层实现框架:
![]()
![]()
- 定义通用的layout布局结构-BasicClip
{
ClipType string `json:"clipType"`
LeftMargin int `json:"leftMargin"`
PosX *int `json:"posX"`
PosY *int `json:"posY"`
Width int `json:"width"`
Height int `json:"height"`
}
在此基础上扩展出更丰富的BorderClip, TextClip, ImageClip等类型,来满足不同的布局元素设计。
- 定义通用的videoMask结构,它可以包含多个clip interface, 即各种clip元素,在videoMask中各个clip是同一个layer的,只允许在限定的尺寸中进行布局。
type VideoMask struct {
Layer int `json:"layer"`
Clips []interface{} `json:"clips"`
}
- 每个输入的视频流,可以包含多个videoMask,多个videoMask在最终overlay的时候,按定义的layer先后顺序进行铺叠,以达到最终的预期视频布局效果。
应用场景拓展
◦当设备不支持同时拉多路流时使用混流,比如sip入会的场景。
◦需要多个视频画面、多个音频流合成一个直播流时使用混流,比如会议录制(rtc协议)场景、教育类场景(直播老师和学生的画面)、直播连麦的场景等。
总结:此次能在618重保期间发挥它的价值,也算是有所得。希望以后可以在日常直播、展会等其他重要直播活动中发挥作用。关于混流的产品介绍以及更多的使用场景也会在后续的文章中一一展开,敬请期待。
作者:京东科技 孟晓伟
来源:京东云开发者社区