wang-bin / mdk-sdk

multimedia development kit. download:
https://sourceforge.net/projects/mdk-sdk/files/
250 stars 30 forks source link

rtsp内存泄露 #195

Open cnyinfei opened 2 months ago

cnyinfei commented 2 months ago

0.26版本的mdk-examples和mdk-sdk,使用自带的glfwplay和qmdkplay连续播放摄像头rtsp流,发现过一段时间后内存稳步增长。为了加大测试力度,我基于libqtmdk构造了一个qt测试程序,同时拉流32路摄像头主码流,经过大约10小时左右,所消耗内存增长到约16GB。

wang-bin commented 2 months ago

系统环境、解码设置等信息呢

cnyinfei commented 2 months ago

系统Windows10 22H2,16GB内存,i7-10700,无独显,使用的是CPU核显。 qmdkplay是用示例代码直接编译的,代码未做修改; glfwplay是使用的sdk压缩包里面预编译好的二进制执行文件; 两者都未指定解码设置,应是使用的默认设置。 摄像头为局域网海康枪机。

wang-bin commented 2 months ago

glfwplay命令行参数是怎么样的?

cnyinfei commented 2 months ago

glfwplay命令行参数是怎么样的?

.\glfwplay rtsp://... .\qmdkplay rtsp://...

除了rtsp地址外没有附带其他参数。qmdkplay使用Qt5.14.2 mingw64 环境编译。

feiyangqingyun commented 2 months ago

你这内存增长有点吓人,明天我开16路试试

wang-bin commented 2 months ago

本地视频循环播了20小时内存没涨。是rtsp才能复现?

feiyangqingyun commented 2 months ago

我测试了16路1080p rtsp,目测有泄露,10分钟大概涨了约50mb左右

cnyinfei commented 2 months ago

我昨天测试了两个公网的rtsp,没有重现,目前看还只在摄像机的rtsp流上出现这个问题。包括从摄像机拉流到流媒体代理出来的也有问题。

wang-bin commented 2 months ago

linux上用asan跑没发现有泄漏。windows上rtsp确实内存一直在涨,还没用工具查哪里泄漏的。

wang-bin commented 2 months ago

大概率是ffmpeg的bug,用glfwplay -avformat.rtsp_transport tcp rtsp://....就没问题,默认是udp会泄漏。我用mpv也验证了下,mpv默认用tcp没泄漏,用mpv --rtsp_transport=udp就会泄漏。最近有人提交了个udp相关的补丁,不过我没验证,好像也没看到相关日志,所以不确定这个补丁是不是能修复这个泄漏问题

cnyinfei commented 2 months ago

我这边加上-avformat.rtsp_transport tcp 验证一下

wang-bin commented 2 months ago

本地用zlmediakit+ffmpeg推rtsp,mpv和glfwplay(tcp)同时播了一天后卡得完全不能看了,两个都是音视频不同步,我这边缓存了1G多的包没解码,mpv也落后了13小时以上但是包丢弃了,所以你碰到的可能不是泄漏,其他地方出问题了. glfwplay加参数-buffer_drop可以丢弃落后的包,直播流推荐加这个参数

>53832952 07:36:07.2/13:14:21 cache 0v 0.4s/1135755KB 93324KB/s diff |-26465739|>4ms update 67.1ms 7.4fps draw 1/2 +12153474ms drop 29652926
>53833502 07:36:10.6/13:14:21 cache 2v 0.1s/1135643KB 311KB/s diff |-26462832|>4ms update 62.8ms 8.1fps draw 0/1 +12155537ms drop 2965807356

mpv

(+) Video --vid=1 (h264 1920x1080 24.000fps)
 (+) Audio --aid=1 (aac 6ch 48000Hz)
File tags:
 Title: Streamed by ZLMediaKit(git hash:68ea546/2022-11-29T11:33:16+08:00,branch:master,build time:2022-11-29T14:46:19)
AO: [wasapi] 48000Hz 5.1 6ch float
VO: [gpu] 1920x1080 yuv420p
Exiting... (Quit)
AV: 07:57:45 / 21:13:07 (38%) A-V:47713.908 ct:11673.879 Dropped: 629231
cnyinfei commented 2 months ago

很有可能是你说的这个问题了,我昨天测试了一下,用glfwplay直接播放rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid没有问题,用ZLMediaKit代理转一次以后,在有一台电脑上就会内存疯涨,其他摄像头也是经过ZLMediaKit代理后播放就有问题。但用vlc和Qt自带播放器组件是OK的。 今天我再验证一下你的解决方案。 这个参数也同样适用于libqtmdk吗?

wang-bin commented 2 months ago

用这个接口 https://github.com/wang-bin/mdk-sdk/wiki/Player-APIs#void-setbufferrangeint64_t-minms-int64_t-maxms-bool-drop--false

drop参数设为true,其他设为-1

cnyinfei commented 2 months ago

我这里测试drop buffer参数对glfwplay无效,setBufferRange对qmkdplay无效,内存增长问题仍然存在。

wang-bin commented 2 months ago

你试下mpv,可能也会泄漏,如果是的话那就不是我这边的bug了 https://github.com/media-kit/media-kit/issues/776#issuecomment-2072158673

feiyangqingyun commented 4 weeks ago

王总这个问题在0.28版本,有没有搞定。我有个朋友也说rtsp存在比较大的泄露