问题遇到的现象和发生背景
Unity 使用UMP插件多路播放视频,因为有切换RTSP流播放的需求,频繁切换下,CPU和内存占用爆炸,具体操作如下:
左边是一个摄像机列表,右边是九屏幕的播放器
实际上九屏幕播放器就是九个UMP插件预制体组成的播放器,已经预置好了
用代码块功能插入代码,请勿粘贴截图
这是单击播放器切换话画面的代码
单击播放器,会把自己选择的rtsp流给UMP播放器的path属性,然后play()
//单击播放器,会把自己选择的rtsp流给UMP播放器的path属性,然后play()
if (rtsp != "" && rtsp != null)
{
OnClikeButton.GetComponentInChildren<UniversalMediaPlayer>().Path = rtsp;
//播放
OnClikeButton.GetComponentInChildren<UniversalMediaPlayer>().Play();
OnClikeButton.transform.Find("Txt").GetComponent<Text>().text = information;
}
这是双击之后,隐藏其他所有播放器,放大这个播放器的代码,以及放大之后再双击缩小的代码
除了被双击放大的播放器,其他的播放器直接SetActive(false),有正在播放的rtsp地址,就保存起来
//除了被双击放大的播放器,其他的播放器直接SetActive(false),有正在播放的rtsp地址,就保存起来。
if (item.Value.GetComponentInChildren<UniversalMediaPlayer>().Path!=""&& item.Value.GetComponentInChildren<UniversalMediaPlayer>().Path != null)
{
RtspList[item.Key].substream = item.Value.GetComponentInChildren<UniversalMediaPlayer>().Path;
}
item.Value.SetActive(false);
当被放大的播放器缩小,其他播放器SetActive(true),并把保存的rtsp地址重新赋值并play
item.Value.SetActive(true);
foreach (var item1 in RtspList)
{
if (item.Key == item1.Key && item1.Value!=null)
{
item.Value.GetComponentInChildren<UniversalMediaPlayer>().Path = item1.Value.substream;
item.Value.GetComponentInChildren<UniversalMediaPlayer>().Play();
}
}
运行结果及报错内容
当我在摄像机列表选择了一个画面放到九屏幕播放器里面播放,把九个画面填满,cpu占用极高
当我反复执行的放大一个画面隐藏其他画面,亦或频繁的给其中一个播放器重新替换画面,实际上都是频繁切换rtsp地址的操作,导致了CPU爆炸
放大效果图
缩小效果图
我的解答思路和尝试过的方法
之所以这样,我个人猜测可能是频繁的,或者密集的建立TCP通道和断开TCP通道造成的紊乱,和TCP通道无法及时断开造成的
我尝试过先stop再play,那样效果更差。
画面之所以这么模糊是我将主码流切换为辅码流,否则,连9屏幕的画面都支撑不了
也试过赋值的时候略微给一些延迟,效果依然不是很理想
我想要达到的结果
解决在unity平台多路播放rtsp流CPU占用过高和频繁切换rtsp流CPU占用爆炸的问题