Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] 删除录像文件成功,但是文件还是存在 #3531

Closed
bigff-0527 opened this issue May 13, 2024 · 26 comments
Closed

[BUG] 删除录像文件成功,但是文件还是存在 #3531

bigff-0527 opened this issue May 13, 2024 · 26 comments

Comments

@bigff-0527
Copy link

咨询的功能模块

  • zlm的删除录像文件(deleteRecordDirectory)

咨询的具体内容和问题

  • wvp调用zlm的deleteRecordDirectory接口,返回的是code = 0;并且zlm日志都是删除成功的
    image
    但是我这边查看磁盘,文件还是存在的,请问是为什么。
@bigff-0527 bigff-0527 added the bug label May 13, 2024
@xiongguangjie
Copy link
Member

path的文件还存在???

@bigff-0527
Copy link
Author

path的文件还存在???

是的,我刚才随便找了个看,录像文件是在的,两个晚上,云端录像wvp上大概1.6w条(之前一个晚上wvp云端录像数据表是8k多条),我目前是修改了wvp删除云端录像定时器源码,是30分钟查询一次数据库,有数据就执行zlm删除录像文件的api(跟源码逻辑一样,不过我修改了获取录像数据的方式),目前wvp数据库是删除干净的。我没注意去看定时器平均执行一次删除多少个,我目前有几个十几个几十个云端录像时定时器删除是没问题的。会不会是数据太多导致zlm没删除完?

@xiongguangjie
Copy link
Member

path的文件还存在???

是的,我刚才随便找了个看,录像文件是在的,两个晚上,云端录像wvp上大概1.6w条(之前一个晚上wvp云端录像数据表是8k多条),我目前是修改了wvp删除云端录像定时器源码,是30分钟查询一次数据库,有数据就执行zlm删除录像文件的api(跟源码逻辑一样,不过我修改了获取录像数据的方式),目前wvp数据库是删除干净的。我没注意去看定时器平均执行一次删除多少个,我目前有几个十几个几十个云端录像时定时器删除是没问题的。会不会是数据太多导致zlm没删除完?

这个不应该,是不是文件被占用了(还在被其他程序占用),没被删除成功

@bigff-0527
Copy link
Author

path的文件还存在???

是的,我刚才随便找了个看,录像文件是在的,两个晚上,云端录像wvp上大概1.6w条(之前一个晚上wvp云端录像数据表是8k多条),我目前是修改了wvp删除云端录像定时器源码,是30分钟查询一次数据库,有数据就执行zlm删除录像文件的api(跟源码逻辑一样,不过我修改了获取录像数据的方式),目前wvp数据库是删除干净的。我没注意去看定时器平均执行一次删除多少个,我目前有几个十几个几十个云端录像时定时器删除是没问题的。会不会是数据太多导致zlm没删除完?

这个不应该,是不是文件被占用了(还在被其他程序占用),没被删除成功

不应该吧,我现在一样能删除,不过是文件数量没当时那么多。如果没被删除成功 zlm也会返回code = 0吗?

@xiongguangjie
Copy link
Member

path的文件还存在???

是的,我刚才随便找了个看,录像文件是在的,两个晚上,云端录像wvp上大概1.6w条(之前一个晚上wvp云端录像数据表是8k多条),我目前是修改了wvp删除云端录像定时器源码,是30分钟查询一次数据库,有数据就执行zlm删除录像文件的api(跟源码逻辑一样,不过我修改了获取录像数据的方式),目前wvp数据库是删除干净的。我没注意去看定时器平均执行一次删除多少个,我目前有几个十几个几十个云端录像时定时器删除是没问题的。会不会是数据太多导致zlm没删除完?

这个不应该,是不是文件被占用了(还在被其他程序占用),没被删除成功

不应该吧,我现在一样能删除,不过是文件数量没当时那么多。如果没被删除成功 zlm也会返回code = 0吗?

我看看

@xiongguangjie
Copy link
Member

不会呀,返回0 就是删除成功了

@bigff-0527
Copy link
Author

不会呀,返回0 就是删除成功了

那我也不清楚了QAQ,,我周六下班之后就没管了。今天上班一看服务器磁盘都要满了,发现wvp里的云端录像表是删除干净的,但是zlm的record目录下有将近20g的mp4。

@xiongguangjie
Copy link
Member

不会呀,返回0 就是删除成功了

那我也不清楚了QAQ,,我周六下班之后就没管了。今天上班一看服务器磁盘都要满了,发现wvp里的云端录像表是删除干净的,但是zlm的record目录下有将近20g的mp4。

看下dmesg与zlm的日志是不是有报错之类的

@bigff-0527
Copy link
Author

不会呀,返回0 就是删除成功了

zlm生成云端录像时,是不是生成完整的mp4后才插入wvp云端录像表中?如果是的话,我这样删除也没问题呀。源码也是这个逻辑的

@xiongguangjie
Copy link
Member

不会呀,返回0 就是删除成功了

zlm生成云端录像时,是不是生成完整的mp4后才插入wvp云端录像表中?如果是的话,我这样删除也没问题呀。源码也是这个逻辑的

这个有webhook 去通知wvp

@bigff-0527
Copy link
Author

不会呀,返回0 就是删除成功了

那我也不清楚了QAQ,,我周六下班之后就没管了。今天上班一看服务器磁盘都要满了,发现wvp里的云端录像表是删除干净的,但是zlm的record目录下有将近20g的mp4。

看下dmesg与zlm的日志是不是有报错之类的

zlm日志是没看到报错的,wvp也是根据zlm删除的接口code=0才输出日志的,最开始我是看wvp日志的,发现文件还是存在

@bigff-0527
Copy link
Author

不会呀,返回0 就是删除成功了

zlm生成云端录像时,是不是生成完整的mp4后才插入wvp云端录像表中?如果是的话,我这样删除也没问题呀。源码也是这个逻辑的

这个有webhook 去通知wvp

image

@xia-chu
Copy link
Member

xia-chu commented May 13, 2024

deleteRecordDirectory返回0 不一定代表删除成功了:
image

如果删除正在录制的流的文件夹,正在录制的文件不会被删除

@xia-chu
Copy link
Member

xia-chu commented May 13, 2024

不过这个代码确实有问题 指定文件时(而非文件夹),如果这个流正在录制,确实会删除失败

@xiongguangjie
Copy link
Member

deleteRecordDirectory返回0 不一定代表删除成功了: image

如果删除正在录制的流的文件夹,正在录制的文件不会被删除
结果code为0 表示是调用delete_file 成功,而且看他的截图,他是直接删除文件的,不是删除目录与正在录制的文件

@bigff-0527
Copy link
Author

deleteRecordDirectory返回0 不一定代表删除成功了: image

如果删除正在录制的流的文件夹,正在录制的文件不会被删除

大佬,zlm正在录制的mp4是不会通知wvp的吧,wvp云端录制表也不会插入新数据,我这边是先获取wvp云端表数据才调用删除的,应该不存在正在录制的mp4文件吧。还有一点 删除应该是删除指定的mp4文件,应该不是删除整个文件夹吧

@xia-chu
Copy link
Member

xia-chu commented May 13, 2024

打个补丁吧:

Index: server/WebApi.cpp
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/server/WebApi.cpp b/server/WebApi.cpp
--- a/server/WebApi.cpp	(revision bbdbd6a3e0b73123202965e1899791ffec351572)
+++ b/server/WebApi.cpp	(date 1715569309155)
@@ -1590,12 +1590,14 @@
         auto record_path = Recorder::getRecordPath(Recorder::type_mp4, tuple, allArgs["customized_path"]);
         auto period = allArgs["period"];
         record_path = record_path + period + "/";
+
+        bool recording = false;
         auto name = allArgs["name"];
         if (!name.empty()) {
+            // 删除指定文件
             record_path += name;
-        }
-        bool recording = false;
-        {
+        } else {
+            // 删除文件夹,先判断该流是否正在录制中
             auto src = MediaSource::find(allArgs["vhost"], allArgs["app"], allArgs["stream"]);
             if (src && src->isRecording(Recorder::type_mp4)) {
                 recording = true;

测试没问题麻烦提个pr

@xia-chu
Copy link
Member

xia-chu commented May 13, 2024

@xiongguangjie 要不你直接提代码吧 你方便点。

@bigff-0527
Copy link
Author

辛苦了大佬们

@bigff-0527
Copy link
Author

@xiongguangjie 要不你直接提代码吧 你方便点。

大佬能提问一下吗,就是能否实现实时预览不生成云端录像。而调用下载设备录像时才生成呢。或者简单来说就是 openRtpServer接口能否给个enable_mp4来控制当前流是否录制。

@xia-chu
Copy link
Member

xia-chu commented May 13, 2024

@xiongguangjie 要不你直接提代码吧 你方便点。

大佬能提问一下吗,就是能否实现实时预览不生成云端录像。而调用下载设备录像时才生成呢。或者简单来说就是 openRtpServer接口能否给个enable_mp4来控制当前流是否录制。

on_publish hook不是开放这个能力给你了吗

@xiongguangjie
Copy link
Member

@xiongguangjie 要不你直接提代码吧 你方便点。

大佬能提问一下吗,就是能否实现实时预览不生成云端录像。而调用下载设备录像时才生成呢。或者简单来说就是 openRtpServer接口能否给个enable_mp4来控制当前流是否录制。

现在就是的,可以通过hook 可以控制是否录像(同时也可以通过接口控制算法录像),on_publish 的返回值,同时你没流怎么录像?????

@bigff-0527
Copy link
Author

@xiongguangjie 要不你直接提代码吧 你方便点。

大佬能提问一下吗,就是能否实现实时预览不生成云端录像。而调用下载设备录像时才生成呢。或者简单来说就是 openRtpServer接口能否给个enable_mp4来控制当前流是否录制。

on_publish hook不是开放这个能力给你了吗

好的好的,我去看看

@bigff-0527
Copy link
Author

@xiongguangjie 要不你直接提代码吧 你方便点。

大佬能提问一下吗,就是能否实现实时预览不生成云端录像。而调用下载设备录像时才生成呢。或者简单来说就是 openRtpServer接口能否给个enable_mp4来控制当前流是否录制。

现在就是的,可以通过hook 可以控制是否录像(同时也可以通过接口控制算法录像),on_publish 的返回值,同时你没流怎么录像?????

好的,我目前的需求就是,不需要实时预览时产生多余的云端录像,只有我在wvp调用下载国标录像时生成云端录像,所以我修改了wvp源码,从定时器入手删除文件的o_O。如果大佬们更新了补丁的话,定时器也能实现我的需求

@sincebyte
Copy link

时器入手删除文件的o_O。如果大佬们更新了补丁的话,定时器也能实现我的需求
不行的,如果wvp与zlm不部署在同一服务器上,这个操作是不行的,还是需要zlm删除才行。

@bigff-0527
Copy link
Author

器入手删除文件的o_O。如果大佬们更新了补丁的话,定时器
我目前不需要定时器删除了,用on_record_mp4 来控制 某个stream是否录制

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants