nedo-vision-worker 1.2.0__tar.gz → 1.2.2__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.2.0 → nedo_vision_worker-1.2.2}/PKG-INFO +3 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/README.md +2 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/__init__.py +1 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/cli.py +1 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/doctor.py +32 -2
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourceRepository.py +10 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/GrpcClientBase.py +1 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/VideoStreamClient.py +14 -8
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerSourcePipelineClient.py +189 -176
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerSourceUpdater.py +4 -3
- nedo_vision_worker-1.2.2/nedo_vision_worker/util/FFmpegUtil.py +73 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/VideoProbeUtil.py +6 -8
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DataSenderWorker.py +1 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/PipelineImageWorker.py +1 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/PKG-INFO +3 -1
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/SOURCES.txt +1 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/config/ConfigurationManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/config/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/database/DatabaseManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/database/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/initializer/AppInitializer.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/initializer/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/ai_model.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/auth.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/config.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/dataset_source.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/logs.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/ppe_detection.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/ppe_detection_label.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/restricted_area_violation.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/user.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline_config.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline_debug.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/models/worker_source_pipeline_detection.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/AIModelService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/AIModelService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/DatasetSourceService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/DatasetSourceService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/HumanDetectionService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/HumanDetectionService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/PPEDetectionService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/PPEDetectionService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/VisionWorkerService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/VisionWorkerService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourceService_pb2.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/WorkerSourceService_pb2_grpc.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/protos/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/AIModelRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/DatasetSourceRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/PPEDetectionRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/RestrictedAreaRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/WorkerSourcePipelineRepository.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/repositories/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/AIModelClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/ConnectionInfoClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/DatasetSourceClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/FileToRTMPServer.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/GrpcClientManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/ImageUploadClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/PPEDetectionClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/RTSPtoRTMPStreamer.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/RestrictedAreaClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SharedDirectDeviceClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SharedVideoStreamServer.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SystemUsageClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/SystemWideDeviceCoordinator.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/VideoSharingDaemon.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerSourceClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/WorkerStatusClient.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/HardwareID.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/ImageUploader.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/Networking.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/PlatformDetector.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/SystemMonitor.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/util/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/CoreActionWorker.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DataSyncWorker.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DatasetFrameSender.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/DatasetFrameWorker.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/PPEDetectionManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/PipelineActionWorker.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/RabbitMQListener.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/RestrictedAreaManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/SystemUsageManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/VideoStreamWorker.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/WorkerManager.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker/__init__.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/worker_service.py +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/dependency_links.txt +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/entry_points.txt +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/requires.txt +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker.egg-info/top_level.txt +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/pyproject.toml +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/setup.cfg +0 -0
- {nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
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>
|
|
@@ -165,6 +165,8 @@ pip install -e .
|
|
|
165
165
|
pip install -e .[dev]
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
+
See [INSTALL.md](INSTALL.md) for detailed installation instructions.
|
|
169
|
+
|
|
168
170
|
## 🔍 System Diagnostics
|
|
169
171
|
|
|
170
172
|
Before running the worker service, use the built-in diagnostic tool to verify your system:
|
|
@@ -112,6 +112,8 @@ pip install -e .
|
|
|
112
112
|
pip install -e .[dev]
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
+
See [INSTALL.md](INSTALL.md) for detailed installation instructions.
|
|
116
|
+
|
|
115
117
|
## 🔍 System Diagnostics
|
|
116
118
|
|
|
117
119
|
Before running the worker service, use the built-in diagnostic tool to verify your system:
|
|
@@ -87,8 +87,8 @@ class WorkerServiceDoctor:
|
|
|
87
87
|
def check_python_environment(self) -> None:
|
|
88
88
|
"""Comprehensive Python environment validation."""
|
|
89
89
|
version = sys.version_info
|
|
90
|
-
min_version = (3,
|
|
91
|
-
recommended_version = (3,
|
|
90
|
+
min_version = (3, 10)
|
|
91
|
+
recommended_version = (3, 10)
|
|
92
92
|
|
|
93
93
|
details = [
|
|
94
94
|
f"Python {version.major}.{version.minor}.{version.micro}",
|
|
@@ -891,6 +891,36 @@ class WorkerServiceDoctor:
|
|
|
891
891
|
performance_impact=performance_impact
|
|
892
892
|
))
|
|
893
893
|
|
|
894
|
+
def check_psutil_installation(self) -> None:
|
|
895
|
+
"""Check if psutil is installed for system monitoring."""
|
|
896
|
+
details = []
|
|
897
|
+
recommendations = []
|
|
898
|
+
try:
|
|
899
|
+
import psutil
|
|
900
|
+
version = getattr(psutil, '__version__', 'N/A')
|
|
901
|
+
details.append(f"psutil version: {version}")
|
|
902
|
+
status = HealthStatus.GOOD
|
|
903
|
+
message = "psutil is installed"
|
|
904
|
+
is_blocking = False
|
|
905
|
+
performance_impact = "None"
|
|
906
|
+
except ImportError:
|
|
907
|
+
status = HealthStatus.WARNING
|
|
908
|
+
message = "psutil not installed"
|
|
909
|
+
details.append("System resource monitoring will be disabled.")
|
|
910
|
+
recommendations.append("Install psutil for system monitoring: pip install psutil")
|
|
911
|
+
is_blocking = False
|
|
912
|
+
performance_impact = "Low"
|
|
913
|
+
|
|
914
|
+
self._add_result(HealthCheck(
|
|
915
|
+
name="System Monitoring (psutil)",
|
|
916
|
+
status=status,
|
|
917
|
+
message=message,
|
|
918
|
+
details=details,
|
|
919
|
+
recommendations=recommendations if recommendations else None,
|
|
920
|
+
is_blocking=is_blocking,
|
|
921
|
+
performance_impact=performance_impact
|
|
922
|
+
))
|
|
923
|
+
|
|
894
924
|
def run_comprehensive_health_check(self) -> List[HealthCheck]:
|
|
895
925
|
"""Execute all health checks with progress indication."""
|
|
896
926
|
print("🏥 Nedo Vision Worker Service - Comprehensive Health Check")
|
|
@@ -17,6 +17,15 @@ class WorkerSourceRepository:
|
|
|
17
17
|
except Exception as e:
|
|
18
18
|
logger.error(f"🚨 [APP] Database error while fetching worker sources: {e}", exc_info=True)
|
|
19
19
|
return []
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_worker_sources_by_worker_id(self, worker_id: str):
|
|
23
|
+
"""Retrieve all worker sources from the database."""
|
|
24
|
+
try:
|
|
25
|
+
return self.session.query(WorkerSourceEntity).filter_by(worker_id=worker_id).all()
|
|
26
|
+
except Exception as e:
|
|
27
|
+
logger.error(f"🚨 [APP] Database error while fetching worker sources: {e}", exc_info=True)
|
|
28
|
+
return []
|
|
20
29
|
|
|
21
30
|
def bulk_update_worker_sources(self, updated_records):
|
|
22
31
|
"""Batch update worker sources in the database."""
|
|
@@ -43,4 +52,4 @@ class WorkerSourceRepository:
|
|
|
43
52
|
return None
|
|
44
53
|
except Exception as e:
|
|
45
54
|
logger.error(f"🚨 [APP] Database error while fetching worker source by ID {worker_source_id}: {e}", exc_info=True)
|
|
46
|
-
return None
|
|
55
|
+
return None
|
{nedo_vision_worker-1.2.0 → nedo_vision_worker-1.2.2}/nedo_vision_worker/services/GrpcClientBase.py
RENAMED
|
@@ -68,7 +68,7 @@ class GrpcClientBase:
|
|
|
68
68
|
self.connected = False
|
|
69
69
|
error_msg = str(e)
|
|
70
70
|
|
|
71
|
-
logger.error(f"⚠️ Connection failed ({attempts}/{self.max_retries}): {error_msg}")
|
|
71
|
+
logger.error(f"⚠️ Connection failed ({attempts}/{self.max_retries}): {error_msg}", exc_info=True)
|
|
72
72
|
|
|
73
73
|
if attempts < self.max_retries:
|
|
74
74
|
sleep_time = retry_interval * (2 ** (attempts - 1))
|
|
@@ -8,6 +8,7 @@ import fractions
|
|
|
8
8
|
from urllib.parse import urlparse
|
|
9
9
|
from .GrpcClientBase import GrpcClientBase
|
|
10
10
|
from .SharedDirectDeviceClient import SharedDirectDeviceClient
|
|
11
|
+
from ..util.FFmpegUtil import get_rtsp_ffmpeg_options, get_rtsp_probe_options
|
|
11
12
|
from ..protos.VisionWorkerService_pb2_grpc import VideoStreamServiceStub
|
|
12
13
|
from ..protos.VisionWorkerService_pb2 import VideoFrame
|
|
13
14
|
|
|
@@ -47,8 +48,10 @@ class VideoStreamClient(GrpcClientBase):
|
|
|
47
48
|
]
|
|
48
49
|
|
|
49
50
|
if stream_type == "rtsp":
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
probe_options = get_rtsp_probe_options()
|
|
52
|
+
# Insert options at the beginning (after ffprobe)
|
|
53
|
+
for i, option in enumerate(probe_options):
|
|
54
|
+
probe_cmd.insert(1 + i, option)
|
|
52
55
|
|
|
53
56
|
result = subprocess.run(probe_cmd, capture_output=True, text=True)
|
|
54
57
|
probe_data = json.loads(result.stdout)
|
|
@@ -97,10 +100,8 @@ class VideoStreamClient(GrpcClientBase):
|
|
|
97
100
|
logging.error(f"Failed to create ffmpeg input for direct device: {e}")
|
|
98
101
|
return
|
|
99
102
|
elif stream_type == "rtsp":
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
.input(url, rtsp_transport="tcp", fflags="nobuffer", timeout="5000000")
|
|
103
|
-
)
|
|
103
|
+
rtsp_options = get_rtsp_ffmpeg_options()
|
|
104
|
+
ffmpeg_input = ffmpeg.input(url, **rtsp_options)
|
|
104
105
|
elif stream_type == "hls":
|
|
105
106
|
ffmpeg_input = (
|
|
106
107
|
ffmpeg
|
|
@@ -148,8 +149,13 @@ class VideoStreamClient(GrpcClientBase):
|
|
|
148
149
|
if stream_type == "direct":
|
|
149
150
|
self.shared_device_client.release_device_access(url)
|
|
150
151
|
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
try:
|
|
153
|
+
stderr_output = process.stderr.read().decode()
|
|
154
|
+
if stderr_output.strip(): # Only log if there's actual error content
|
|
155
|
+
logging.error(f"FFmpeg stderr for {stream_type} stream: {stderr_output}")
|
|
156
|
+
except Exception as e:
|
|
157
|
+
logging.warning(f"Could not read FFmpeg stderr: {e}")
|
|
158
|
+
|
|
153
159
|
process.terminate()
|
|
154
160
|
process.wait()
|
|
155
161
|
|