UE的rtsp插件崩溃过程排查

Part1前言

Invideo插件是一个UE5的rtsp视频播放插件,当然还可以播放主流的其他视频协议。其开源地址如下https://github.com/inveta/InVideo

3a8d1d5afff8edfc81e309f5648db67f.png

前段时间有网页反馈使用该插件进行播放视频的时候会有偶发程序崩溃。

53013bf9580fdbbeb946bed0e1040212.png

Part2问题排查

当看到留言之后,其实并没有什么排查思路。后续这位网友有加了我们qq技术交流群:681464378
给出了更加详细的信息描述。

a5cee981455095cb089735e6295cb8d6.jpeg

并且强调在大分辨率的情况下,崩溃的概率会高很多。而且主要集中在视频打开和关闭的时候。

接下来找到虚幻的源码发现崩溃在第一个checkf里面。这里校验了传入参数UpdataRegion。

60492c8c6d11e2ac9d53b2d701f0f5f4.jpeg

UpdataRegion这个参数类型是FUpdateTextureRegion2D,通过查看代码,发现是我们自己传入的。在UInVideoWidget::UpdateTextureRegions函数中调用ENQUEUE_RENDER_COMMAND传入到的渲染线程。
而传入的对象的值通过下面方法创建

m_VideoUpdateTextureRegion = new FUpdateTextureRegion2D(0, 0, 0, 0, m_VideoSize.X, m_VideoSize.Y);

通过比较我们创建时候的值和崩溃时候的值,我们发现明明我们初始化的值是0,但是在崩溃的时候,编程了一个非常大的值:-1861933592。这只能说明我们传入的对象被释放了,但是渲染线程还在使用。

我们释放的情况只有在执行视频关闭的时候,才会进行。相关代码在void UInVideoWidget::StopPlay()中进行。释放方法如下

if (nullptr != m_VideoUpdateTextureRegion) 
 { 
 delete m_VideoUpdateTextureRegion; 
 m_VideoUpdateTextureRegion = nullptr; 
 }

那么为什么我们把视频释放了,渲染线程还会继续渲染呢?
这是一个多线程问题,因为分辨率设置过大,导致gpu显卡性能下降,然后这个bug就出来了。在视频释放之后,渲染队列之前的任务还没有执行完成,之后就会使用已经释放的指针。分辨率低的时候,渲染线程性能好,不会有延迟,所以就不会出现。
后续修改程序将每次传递这个值从新new一个出来RegionData->Regions = new FUpdateTextureRegion2D(*Regions);再然后介绍之后再进行释放delete RegionData->Regions;

Part3后续反馈

按照这个思路修改之后,目前没有收到崩溃的问题。

b1e535deedbeb096b7398b7cf680b5cf.png

所以后续推荐使用V1.4版本 https://github.com/inveta/InVideo/releases/tag/V1.4

Part4总结

本文针对InVideo播放rtsp视频崩溃的bug进行了复盘并进行了修复。

206752105c81257f78e6f766de1af75c.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想手写一个浏览器播放rtsp插件,您可以根据以下步骤进行: 1. 了解rtsp协议 首先,您需要了解rtsp协议的工作原理和基本知识。rtsp是一种用于流媒体传输的协议,它允许客户端与服务器建立连接并进行数据传输。您需要了解rtsp协议的请求和响应格式,以及rtsp常用的状态码和标头。 2. 选择开发语言和框架 开发rtsp插件需要选择适合您的开发语言和框架。您可以选择使用C++、Java、JavaScript等语言,并选择适合浏览器插件开发的框架,如NPAPI、ActiveX等。 3. 实现rtsp插件 实现rtsp插件需要进行以下步骤: - 定义插件的API接口,包括初始化、连接、播放、暂停、停止等方法。 - 实现插件的初始化方法,包括创建插件对象、注册插件接口等。 - 实现插件的连接方法,包括与rtsp服务器建立连接、发送rtsp请求等。 - 实现插件的播放、暂停、停止等方法,包括发送rtsp PLAY、PAUSE、TEARDOWN请求等。 - 实现插件的数据接收和解码,包括接收rtsp数据包、解码视频数据等。 - 实现插件的错误处理和异常处理,包括处理连接错误、播放错误等情况。 4. 测试和发布 完成rtsp插件的开发后,您需要进行测试,并确保插件在不同的浏览器和操作系统上都能正常工作。如果一切正常,您可以将插件发布到插件商店或其他平台上,供用户下载和使用。 需要注意的是,手写浏览器播放rtsp插件需要具备一定的技术水平和经验。如果您没有相关经验,可以考虑使用现成的插件或借助第三方库来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值