nedo-vision-worker 1.3.12__tar.gz → 1.3.14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/PKG-INFO +1 -1
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/__init__.py +1 -1
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/bootstrap.py +2 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/FileToRTMPServer.py +51 -3
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/RTSPtoRTMPStreamer.py +58 -10
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/VideoStreamWorker.py +0 -19
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/PKG-INFO +1 -1
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/README.md +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/cli.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/config/ConfigurationManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/config/ConfigurationManagerInterface.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/config/DummyConfigurationManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/config/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/database/DatabaseManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/database/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/doctor.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/ai_model.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/auth.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/config.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/dataset_source.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/logs.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/ppe_detection.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/ppe_detection_label.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/restricted_area_violation.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/user.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/worker_source.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/worker_source_pipeline.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/worker_source_pipeline_config.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/worker_source_pipeline_debug.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/worker_source_pipeline_detection.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/AIModelService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/AIModelService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/DatasetSourceService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/DatasetSourceService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/HumanDetectionService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/HumanDetectionService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/PPEDetectionService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/PPEDetectionService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/VisionWorkerService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/VisionWorkerService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/WorkerSourceService_pb2.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/WorkerSourceService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/AIModelRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/DatasetSourceRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/PPEDetectionRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/RestrictedAreaRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/WorkerSourcePipelineRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/WorkerSourceRepository.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/AIModelClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/ConnectionInfoClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/DatasetSourceClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/GrpcClientBase.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/GrpcClientManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/GrpcConnection.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/ImageUploadClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/PPEDetectionClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/RestrictedAreaClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/SharedDirectDeviceClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/SharedVideoStreamServer.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/SystemUsageClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/SystemWideDeviceCoordinator.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/VideoSharingDaemon.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/VideoStreamClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/WorkerSourceClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/WorkerSourcePipelineClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/WorkerSourceUpdater.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/WorkerStatusClient.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/CorruptedImageValidator.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/EncoderSelector.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/FFmpegUtil.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/HardwareID.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/ImageUploader.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/Networking.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/PlatformDetector.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/RTMPUrl.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/SystemMonitor.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/VideoProbeUtil.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/CoreActionWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/DataSenderWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/DataSyncWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/DatasetFrameSender.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/DatasetFrameWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/PPEDetectionManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/PipelineActionWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/PipelineImageWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/PipelinePreviewWorker.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/RabbitMQListener.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/RestrictedAreaManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/SystemUsageManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/WorkerManager.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/__init__.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker_service.py +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/SOURCES.txt +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/dependency_links.txt +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/entry_points.txt +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/requires.txt +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/top_level.txt +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/pyproject.toml +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/setup.cfg +0 -0
- {nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.14
|
|
4
4
|
Summary: Nedo Vision Worker Service Library for AI Vision Processing
|
|
5
5
|
Author-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
6
6
|
Maintainer-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import subprocess
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
+
import threading
|
|
4
5
|
from ..util.EncoderSelector import EncoderSelector
|
|
5
6
|
from ..util.RTMPUrl import RTMPUrl
|
|
6
7
|
|
|
@@ -53,6 +54,7 @@ class FileToRTMPStreamer:
|
|
|
53
54
|
"-g", str(self.fps),
|
|
54
55
|
"-vf", f"scale={self.resolution}",
|
|
55
56
|
|
|
57
|
+
"-loglevel", "error",
|
|
56
58
|
"-an", # Disable audio
|
|
57
59
|
|
|
58
60
|
"-f", "flv",
|
|
@@ -63,11 +65,17 @@ class FileToRTMPStreamer:
|
|
|
63
65
|
with open(os.devnull, "w") as devnull:
|
|
64
66
|
self.process = subprocess.Popen(
|
|
65
67
|
ffmpeg_command,
|
|
66
|
-
stdout=
|
|
67
|
-
stderr=
|
|
68
|
-
text=True
|
|
68
|
+
stdout=subprocess.DEVNULL,
|
|
69
|
+
stderr=subprocess.PIPE,
|
|
70
|
+
text=True,
|
|
71
|
+
bufsize=1
|
|
69
72
|
)
|
|
70
73
|
|
|
74
|
+
threading.Thread(
|
|
75
|
+
target=self._monitor_ffmpeg_errors,
|
|
76
|
+
daemon=True
|
|
77
|
+
).start()
|
|
78
|
+
|
|
71
79
|
logging.info("✅ [APP] FFmpeg file stream process started successfully.")
|
|
72
80
|
self.process.wait() # Block until process is terminated
|
|
73
81
|
|
|
@@ -81,3 +89,43 @@ class FileToRTMPStreamer:
|
|
|
81
89
|
self.process.terminate()
|
|
82
90
|
self.process.wait()
|
|
83
91
|
logging.info("🛑 [APP] FFmpeg file stream process terminated.")
|
|
92
|
+
|
|
93
|
+
def _classify_ffmpeg_error(self, msg: str):
|
|
94
|
+
if "No such file or directory" in msg:
|
|
95
|
+
return "FILE_NOT_FOUND"
|
|
96
|
+
|
|
97
|
+
if "Invalid data found" in msg:
|
|
98
|
+
return "INVALID_MEDIA"
|
|
99
|
+
|
|
100
|
+
if "encoder" in msg.lower() or "nvenc" in msg.lower():
|
|
101
|
+
return "ENCODER_ERROR"
|
|
102
|
+
|
|
103
|
+
if "server returned" in msg.lower() or "rtmp" in msg.lower():
|
|
104
|
+
return "RTMP_ERROR"
|
|
105
|
+
|
|
106
|
+
if "broken pipe" in msg.lower():
|
|
107
|
+
return "PIPE_BROKEN"
|
|
108
|
+
|
|
109
|
+
return "UNKNOWN_ERROR"
|
|
110
|
+
|
|
111
|
+
def _monitor_ffmpeg_errors(self):
|
|
112
|
+
"""Read FFmpeg stderr and log meaningful errors."""
|
|
113
|
+
try:
|
|
114
|
+
for line in iter(self.process.stderr.readline, ''):
|
|
115
|
+
if not line:
|
|
116
|
+
break
|
|
117
|
+
|
|
118
|
+
msg = line.strip()
|
|
119
|
+
if not msg:
|
|
120
|
+
continue
|
|
121
|
+
|
|
122
|
+
error_type = self._classify_ffmpeg_error(msg)
|
|
123
|
+
logging.error(f"🔥 [FFMPEG][{error_type}] {msg}")
|
|
124
|
+
|
|
125
|
+
# Stop on critical errors
|
|
126
|
+
if error_type != "UNKNOWN_ERROR":
|
|
127
|
+
logging.error("🛑 [APP] Critical FFmpeg error detected. Stopping stream.")
|
|
128
|
+
self.stop_stream()
|
|
129
|
+
break
|
|
130
|
+
except Exception as e:
|
|
131
|
+
logging.error(f"🚨 [APP] Error while reading FFmpeg stderr: {e}")
|
|
@@ -2,9 +2,13 @@ import subprocess
|
|
|
2
2
|
import logging
|
|
3
3
|
import time
|
|
4
4
|
import os
|
|
5
|
+
import threading
|
|
5
6
|
from urllib.parse import urlparse
|
|
6
7
|
from ..util.EncoderSelector import EncoderSelector
|
|
7
8
|
from ..util.RTMPUrl import RTMPUrl
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
8
12
|
class RTSPtoRTMPStreamer:
|
|
9
13
|
def __init__(self, rtsp_url, stream_key, fps=30, resolution="1280x720", duration=120):
|
|
10
14
|
"""
|
|
@@ -34,14 +38,14 @@ class RTSPtoRTMPStreamer:
|
|
|
34
38
|
def start_stream(self):
|
|
35
39
|
"""Start streaming RTSP to RTMP using FFmpeg without logs."""
|
|
36
40
|
if self._detect_stream_type(self.rtsp_url) == "unknown":
|
|
37
|
-
|
|
41
|
+
logger.error(f"❌ [APP] Invalid RTSP URL: {self.rtsp_url}")
|
|
38
42
|
return
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
logger.info(f"📡 [APP] Starting RTSP to RTMP stream: {self.rtsp_url} → {self.rtmp_url} for {self.duration} seconds")
|
|
41
45
|
|
|
42
46
|
# Get optimal encoder for hardware
|
|
43
47
|
encoder_args, encoder_name = EncoderSelector.get_encoder_args()
|
|
44
|
-
|
|
48
|
+
logger.info(f"🎬 [APP] Using encoder: {encoder_name}")
|
|
45
49
|
|
|
46
50
|
# FFmpeg command
|
|
47
51
|
ffmpeg_command = [
|
|
@@ -61,6 +65,8 @@ class RTSPtoRTMPStreamer:
|
|
|
61
65
|
"-g", "25", # ✅ Reduce GOP size for faster keyframes
|
|
62
66
|
"-vf", "scale='min(1024,iw)':-2", # ✅ Resize width to max 1024px
|
|
63
67
|
|
|
68
|
+
"-loglevel", "error",
|
|
69
|
+
|
|
64
70
|
# ❌ Disable Audio (Avoid unnecessary encoding overhead)
|
|
65
71
|
"-an",
|
|
66
72
|
|
|
@@ -73,23 +79,30 @@ class RTSPtoRTMPStreamer:
|
|
|
73
79
|
with open(os.devnull, "w") as devnull:
|
|
74
80
|
self.process = subprocess.Popen(
|
|
75
81
|
ffmpeg_command,
|
|
76
|
-
stdout=
|
|
77
|
-
stderr=
|
|
78
|
-
text=True
|
|
82
|
+
stdout=subprocess.DEVNULL,
|
|
83
|
+
stderr=subprocess.PIPE,
|
|
84
|
+
text=True,
|
|
85
|
+
bufsize=1
|
|
79
86
|
)
|
|
80
87
|
|
|
81
|
-
|
|
88
|
+
threading.Thread(
|
|
89
|
+
target=self._monitor_ffmpeg_errors,
|
|
90
|
+
daemon=True
|
|
91
|
+
).start()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
logger.info("✅ [APP] FFmpeg process started successfully.")
|
|
82
95
|
|
|
83
96
|
start_time = time.time()
|
|
84
97
|
while self.process.poll() is None:
|
|
85
98
|
if time.time() - start_time > self.duration:
|
|
86
|
-
|
|
99
|
+
logger.info(f"⏳ [APP] Streaming duration {self.duration}s reached. Stopping stream...")
|
|
87
100
|
self.stop_stream()
|
|
88
101
|
break
|
|
89
102
|
time.sleep(1)
|
|
90
103
|
|
|
91
104
|
except Exception as e:
|
|
92
|
-
|
|
105
|
+
logger.error(f"🚨 [APP] Failed to start FFmpeg: {e}")
|
|
93
106
|
self.stop_stream()
|
|
94
107
|
|
|
95
108
|
def stop_stream(self):
|
|
@@ -97,4 +110,39 @@ class RTSPtoRTMPStreamer:
|
|
|
97
110
|
if self.process:
|
|
98
111
|
self.process.terminate()
|
|
99
112
|
self.process.wait()
|
|
100
|
-
|
|
113
|
+
logger.info("FFmpeg process terminated.")
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _monitor_ffmpeg_errors(self):
|
|
117
|
+
for line in iter(self.process.stderr.readline, ''):
|
|
118
|
+
if not line:
|
|
119
|
+
break
|
|
120
|
+
|
|
121
|
+
msg = line.strip()
|
|
122
|
+
if not msg:
|
|
123
|
+
continue
|
|
124
|
+
|
|
125
|
+
error_type = self._classify_ffmpeg_error(msg)
|
|
126
|
+
|
|
127
|
+
logger.error(f"🔥 [FFMPEG][{error_type}] {msg}")
|
|
128
|
+
|
|
129
|
+
if error_type != "UNKNOWN_ERROR":
|
|
130
|
+
logger.error("🛑 [APP] Critical streaming error, stopping FFmpeg.")
|
|
131
|
+
self.stop_stream()
|
|
132
|
+
break
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _classify_ffmpeg_error(self, msg: str):
|
|
136
|
+
if "rtsp" in msg.lower() and "connection" in msg.lower():
|
|
137
|
+
return "RTSP_CONNECTION_ERROR"
|
|
138
|
+
|
|
139
|
+
if "server returned" in msg.lower():
|
|
140
|
+
return "RTMP_SERVER_ERROR"
|
|
141
|
+
|
|
142
|
+
if "encoder" in msg.lower() or "nvenc" in msg.lower():
|
|
143
|
+
return "ENCODER_ERROR"
|
|
144
|
+
|
|
145
|
+
if "broken pipe" in msg.lower():
|
|
146
|
+
return "PIPE_BROKEN"
|
|
147
|
+
|
|
148
|
+
return "UNKNOWN_ERROR"
|
|
@@ -109,25 +109,6 @@ class VideoStreamWorker:
|
|
|
109
109
|
|
|
110
110
|
def _process_video_preview_message(self, message):
|
|
111
111
|
"""Process messages related to video preview streaming."""
|
|
112
|
-
|
|
113
|
-
print("masuk broooo anjayyy")
|
|
114
|
-
|
|
115
|
-
# # Try segmentation fault
|
|
116
|
-
# import ctypes
|
|
117
|
-
|
|
118
|
-
# print("Attempting to access a NULL pointer...")
|
|
119
|
-
|
|
120
|
-
# # Method 1: Dereference a null pointer
|
|
121
|
-
# ctypes.string_at(0)
|
|
122
|
-
|
|
123
|
-
# # Method 2: Write to a protected memory address
|
|
124
|
-
# ctypes.memset(0, 0, 1)
|
|
125
|
-
|
|
126
|
-
# # Method 3: Access invalid pointer
|
|
127
|
-
# invalid_ptr = ctypes.cast(0, ctypes.POINTER(ctypes.c_int))
|
|
128
|
-
# print(invalid_ptr.contents)
|
|
129
|
-
|
|
130
|
-
|
|
131
112
|
try:
|
|
132
113
|
data = json.loads(message)
|
|
133
114
|
worker_id = data.get("workerId")
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.14
|
|
4
4
|
Summary: Nedo Vision Worker Service Library for AI Vision Processing
|
|
5
5
|
Author-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
6
6
|
Maintainer-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/config/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/database/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/__init__.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/ai_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/dataset_source.py
RENAMED
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/ppe_detection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/models/worker_source.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/protos/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/repositories/__init__.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/AIModelClient.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/services/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/EncoderSelector.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/FFmpegUtil.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/HardwareID.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/ImageUploader.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/Networking.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/PlatformDetector.py
RENAMED
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/SystemMonitor.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/util/VideoProbeUtil.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/DataSyncWorker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/WorkerManager.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker/__init__.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker/worker_service.py
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/requires.txt
RENAMED
|
File without changes
|
{nedo_vision_worker-1.3.12 → nedo_vision_worker-1.3.14}/nedo_vision_worker.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|