当前位置: 首页 > 科技观察

通过混流改善音视频直播体验

时间:2023-03-23 10:35:33 科技观察

Translator|朱钢审稿人|孙淑娟教育、音频室直播等场景,开发者可以通过播放混流实现看屏听聊天室所有成员,无需管理聊天室中的每个流。StreamMixing的优点StreamMixing之所以在音视频领域得到广泛应用,是因为它可以为开发者带来以下好处。1.成本低在大型直播或在线教育场景中,如果多方在一个房间内共同主持,房间内的所有用户都需要播放多个流。采用混流技术,只需要播放一个流。即在相互托管的情况下,费用可以减半。在多方托管的情况下,成本可以降低(n-1)/n。如果使用审查机制(例如淫秽节制),成本也可以降低(n-1)/n,因为只需要查看一个图像流。2.简单的代码逻辑当多台主播使用混流时,观众只需要播放混合流并渲染,而不需要播放和渲染多路流。3.跨平台轻松转发如果没有混流,我们无法在多方共管场景下将直播转发到Facebook、YouTube等直播平台。因为这些平台只有一个RTMP地址,我们无法将多个流转发到一个地址。4.移动客户端网页浏览器支持多方共存对于iPhone用户,Safari浏览器不支持同时播放多个音频文件。播放多个流时,只能播放一个流,混流可以解决这个问题。由于手机性能和浏览器性能的限制,大多数手机上的网络浏览器通常最多可以播放四个流。通过混流技术,在不增加带宽和性能消耗的情况下,最大可播放的流数大大增加。什么是混流如下图所示,当一个聊天室中有多个用户发流时,服务器会根据布局配置将两个流合并为一个流,这样观众就可以播放混合流来查看用户A和用户B的屏幕。流混合的实现1.流体混合过程a)服务器监听聊天室中的流变化;b)客户端上的主机发布流;c)当服务端检测到第一个新流时,会开始进行混流操作;d)合办开始发布流;e)服务器检测流添加并更新布局配置;f)联合主办站;g)服务器检测到流减少并更新布局配置;h)房间溶解,混合任务停止。2.ClientLogicClient不需要管理混流逻辑。只需要根据是否需要发布流来判断播放原流还是混合流即可,如下图。3.服务器逻辑服务器需要监听房间内的流变化,并在添加或删除流时更新流混合配置。布局配置根据需要随流的数量而变化。当流数为0时,需要停止混流。4.布局配置ZEGOCLOUD提供了布局配置API。开发者只需要设置每个流的位置和大小。以下示例是一些主要代码。本例中视频画面布局的分辨率设置为360×640。布局一:两个view并排显示/**Createaninputstreamlist.*/ArrayListinputList=newArrayList<>();/**配置第一个inputstream,包括streamID(therealIDoftheinputstream),inputtype,layout等*/ZegoMixerInputinput_1=newZegoMixerstreamID_1",ZegoMixerInputContentType.VIDEO,newRect(0,0,180,640));inputList.add(input_1);/**配置第二个输入流。*/ZegoMixerInput_2=newZegoMixerInput("streamID_2",Zego8O0InputContentType,VIDEOR0RRect.,640));inputList.add(input_2);/**为流混合任务设置输入流列表。*/task.setInputList(inputList);布局2:垂直平铺四个视图/**创建输入流列表。*/ArrayListinputList=newArrayList<>();/**配置第一个输入流,包括streamID(therealIDoftheinputstream),inputtype,layout等*/ZegoMixerInputinput_1=newZegoMixerInput("streamID_1",ZegoMixerInputContentType.VIDEO,newRect(32,180,180add)(List));/**配置第二个inputstream.*/ZegoMixerInputinput_2=newZegoMixerInput("streamID_2",ZegoMixerInputContentType.VIDEO,newRect(180,0,360,320));inputList.add(input_2);/**配置第三个输入流。*/ZegoMixerInput_3=newZegoMixerInput.Input("streamIDgoVIDEO,newRect(0,320,180,640));inputList.add(input_3);/**Configurethefourthinputstream.*/ZegoMixerInput_4=newZegoMixerInput("streamID_4",ZegoMixerInputContentType.VIDEO,newRect(180,add320,List),6in4)input_4);/**Setuptheinputsteamlistforthestreammixingtask.*/task.setInputList(inputList);布局三:平铺一个大view,挂起两个小view输入流的层级由输入流在输入流列表中的位置决定越低的顺序,层级越高,如下代码所示,输入流2和输入流3的层数高于输入流1的层数,所以流2和流3悬停在输入流的屏幕上1./**创建一个输入流列表。*/ArrayListinputList=newArrayList<>();/**配置第一个输入流,包括输入流ID(输入流的真实ID)、输入类型、布局等*/ZegoMixerInputinput_1=newZegoMixerInput("streamID_1",ZegoMixerInputContentType.VIDEO,newRect(0,0,360,640));inputList.add(input_1);/**配置第二输入流。*/ZegoMixerInputinput_2=newZegoMixerInput("streamID_2",ZegoMixerInputContentType.VIDEO,newRect(230,200,340,400));(input_add.2);/**配置第三个输入流。*/ZegoMixerInputinput_3=newZegoMixerInput("streamID_3",ZegoMixerInputContentType.VIDEO,newRect(230,420,340,620));inputList.add(input_3);/**为流混合任务设置输入流列表。*/task.setInputList(inputList);译朱刚,社区编辑,2021IT影响力专家博主,阿里云专家博主,2019CSDN博客之星Top20,2020腾讯云+社区优秀作者,11年一线开发经验,曾参与猎头服务网站ar架构设计、企业智能客服及大型电子政务系统开发,主导某大型央企内部防泄密及电子文档安全监控系统建设,目前在北京途家健康从事医疗软件研发。原标题:Improvelivestreamingexperiencewithstreammixing,作者:DavidRelo

最新推荐
猜你喜欢