nedo-vision-worker-core 0.4.0__tar.gz → 0.4.1__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.
Potentially problematic release.
This version of nedo-vision-worker-core might be problematic. Click here for more details.
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/PKG-INFO +1 -1
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/__init__.py +2 -2
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/PipelineProcessor.py +18 -5
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/streams/RTMPStreamer.py +64 -18
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core.egg-info/PKG-INFO +1 -1
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/MANIFEST.in +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/README.md +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/ai/FrameDrawer.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/ai/ImageDebugger.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/ai/VideoDebugger.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/ai/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/callbacks/DetectionCallbackManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/callbacks/DetectionCallbackTypes.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/callbacks/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/cli.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/config/ConfigurationManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/config/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/core_service.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/database/DatabaseManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/database/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/BaseDetector.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/RFDETRDetector.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/YOLODetector.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/detection_processing/DetectionProcessor.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/detection_processing/HumanDetectionProcessor.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/detection_processing/PPEDetectionProcessor.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/detection/detection_processing/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/doctor.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/blue/inner_corner.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/blue/inner_frame.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/blue/line.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/blue/top_left.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/blue/top_right.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/red/inner_corner.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/red/inner_frame.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/red/line.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/red/top_left.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/drawing_assets/red/top_right.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/boots-green.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/boots-red.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/gloves-green.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/gloves-red.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/goggles-green.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/goggles-red.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/helmet-green.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/helmet-red.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/mask-red.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/vest-green.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/icons/vest-red.png +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/ai_model.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/auth.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/config.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/dataset_source.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/logs.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/ppe_detection.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/ppe_detection_label.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/restricted_area_violation.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/user.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/worker_source.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/worker_source_pipeline.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/worker_source_pipeline_config.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/worker_source_pipeline_debug.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/models/worker_source_pipeline_detection.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/ModelManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/PipelineConfigManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/PipelineManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/PipelinePrepocessor.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/PipelineSyncThread.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/pipeline/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/preprocessing/ImageResizer.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/preprocessing/ImageRoi.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/preprocessing/Preprocessor.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/preprocessing/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/AIModelRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/BaseRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/PPEDetectionRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/RestrictedAreaRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/WorkerSourcePipelineRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/WorkerSourceRepository.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/repositories/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/services/SharedVideoStreamServer.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/services/VideoSharingDaemon.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/services/VideoSharingDaemonManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/streams/SharedVideoDeviceManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/streams/StreamSyncThread.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/streams/VideoStream.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/streams/VideoStreamManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/streams/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/tracker/SFSORT.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/tracker/TrackerManager.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/tracker/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/BoundingBoxMetrics.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/DrawingUtils.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/ModelReadinessChecker.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/PersonAttributeMatcher.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/PersonRestrictedAreaMatcher.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/PipelinePreviewChecker.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/PlatformDetector.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/TablePrinter.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/util/__init__.py +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core.egg-info/SOURCES.txt +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core.egg-info/dependency_links.txt +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core.egg-info/entry_points.txt +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core.egg-info/requires.txt +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core.egg-info/top_level.txt +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/pyproject.toml +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/requirements.txt +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/setup.cfg +0 -0
- {nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker-core
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Nedo Vision Worker Core 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>
|
{nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/__init__.py
RENAMED
|
@@ -7,10 +7,10 @@ A library for running AI vision processing and detection in the Nedo Vision plat
|
|
|
7
7
|
from .core_service import CoreService
|
|
8
8
|
from .callbacks import DetectionType, CallbackTrigger, DetectionData, IntervalMetadata
|
|
9
9
|
|
|
10
|
-
__version__ = "0.4.
|
|
10
|
+
__version__ = "0.4.1"
|
|
11
11
|
__all__ = [
|
|
12
12
|
"CoreService",
|
|
13
|
-
"DetectionType",
|
|
13
|
+
"DetectionType",
|
|
14
14
|
"CallbackTrigger",
|
|
15
15
|
"DetectionData",
|
|
16
16
|
"IntervalMetadata",
|
|
@@ -259,9 +259,10 @@ class PipelineProcessor:
|
|
|
259
259
|
finally:
|
|
260
260
|
self.rtmp_streamer = None
|
|
261
261
|
|
|
262
|
-
#
|
|
263
|
-
if not
|
|
264
|
-
self.frame_queue.
|
|
262
|
+
# Only feed frames to detection queue if detection processor is active
|
|
263
|
+
if self.detection_processor is not None:
|
|
264
|
+
if not self.frame_queue.full():
|
|
265
|
+
self.frame_queue.put_nowait(frame)
|
|
265
266
|
|
|
266
267
|
loop_elapsed = time.time() - loop_start
|
|
267
268
|
sleep_time = max(0.001, target_frame_time - loop_elapsed)
|
|
@@ -307,7 +308,13 @@ class PipelineProcessor:
|
|
|
307
308
|
|
|
308
309
|
while self.running:
|
|
309
310
|
try:
|
|
310
|
-
|
|
311
|
+
# Calculate how long to wait for next detection
|
|
312
|
+
current_time = time.time()
|
|
313
|
+
time_since_last_detection = current_time - last_detection_time
|
|
314
|
+
time_until_next_detection = max(0.1, self.detection_interval - time_since_last_detection)
|
|
315
|
+
|
|
316
|
+
# Wait for frame with timeout aligned to detection interval
|
|
317
|
+
frame = self.frame_queue.get(block=True, timeout=time_until_next_detection)
|
|
311
318
|
|
|
312
319
|
# Check for poison pill (None = stop signal)
|
|
313
320
|
if frame is None:
|
|
@@ -332,9 +339,14 @@ class PipelineProcessor:
|
|
|
332
339
|
except queue.Empty:
|
|
333
340
|
pass
|
|
334
341
|
|
|
335
|
-
# Respect detection interval
|
|
342
|
+
# Respect detection interval - skip if too soon
|
|
336
343
|
if (current_time - last_detection_time) < self.detection_interval:
|
|
344
|
+
# Sleep the remaining time instead of busy-waiting
|
|
345
|
+
remaining_time = self.detection_interval - (current_time - last_detection_time)
|
|
346
|
+
if remaining_time > 0.01:
|
|
347
|
+
time.sleep(remaining_time)
|
|
337
348
|
continue
|
|
349
|
+
|
|
338
350
|
last_detection_time = current_time
|
|
339
351
|
|
|
340
352
|
if self.detection_processor is None or frame is None or frame.size == 0:
|
|
@@ -363,6 +375,7 @@ class PipelineProcessor:
|
|
|
363
375
|
)
|
|
364
376
|
|
|
365
377
|
except queue.Empty:
|
|
378
|
+
# Timeout occurred - this is normal, just continue to next iteration
|
|
366
379
|
pass
|
|
367
380
|
except Exception as e:
|
|
368
381
|
logging.error(f"❌ Error in detection thread for pipeline {pipeline_id}: {e}", exc_info=True)
|
|
@@ -307,6 +307,7 @@ class RTMPStreamer:
|
|
|
307
307
|
if not self.is_active():
|
|
308
308
|
raise BrokenPipeError("FFmpeg process is not active")
|
|
309
309
|
self._ffmpeg_process.stdin.write(frame.tobytes())
|
|
310
|
+
self._ffmpeg_process.stdin.flush() # Ensure data is sent immediately
|
|
310
311
|
except (BrokenPipeError, OSError) as e:
|
|
311
312
|
|
|
312
313
|
# Check if this failure was from a HW encoder
|
|
@@ -356,23 +357,20 @@ class RTMPStreamer:
|
|
|
356
357
|
'-framerate', str(self.fps), '-i', '-',
|
|
357
358
|
]
|
|
358
359
|
|
|
360
|
+
# Add encoder and encoder-specific parameters
|
|
359
361
|
cmd.extend(encoder_args)
|
|
360
362
|
|
|
363
|
+
# Common video parameters
|
|
361
364
|
cmd.extend([
|
|
362
|
-
'-
|
|
365
|
+
'-pix_fmt', 'yuv420p',
|
|
363
366
|
'-b:v', f"{self.bitrate}k", '-maxrate', f"{self.bitrate}k", '-bufsize', f"{self.bitrate*2}k",
|
|
364
367
|
'-g', str(self.fps * 2), '-keyint_min', str(self.fps),
|
|
365
|
-
'-force_key_frames', 'expr:gte(t,n_forced*1)',
|
|
366
|
-
'-
|
|
368
|
+
'-force_key_frames', 'expr:gte(t,n_forced*1)',
|
|
369
|
+
'-an', # No audio
|
|
370
|
+
'-flvflags', 'no_duration_filesize',
|
|
371
|
+
'-f', 'flv', self.rtmp_url,
|
|
367
372
|
])
|
|
368
373
|
|
|
369
|
-
if encoder_name == "libx264":
|
|
370
|
-
cmd.extend([
|
|
371
|
-
"-preset", "ultrafast",
|
|
372
|
-
"-tune", "zerolatency",
|
|
373
|
-
"-x264-params", "open_gop=0:aud=1:repeat-headers=1:nal-hrd=cbr",
|
|
374
|
-
])
|
|
375
|
-
|
|
376
374
|
return cmd, encoder_name
|
|
377
375
|
|
|
378
376
|
def _select_ffmpeg_encoder(self, force_cpu: bool = False) -> Tuple[List[str], str]:
|
|
@@ -381,26 +379,74 @@ class RTMPStreamer:
|
|
|
381
379
|
Will force CPU if force_cpu is True.
|
|
382
380
|
"""
|
|
383
381
|
if force_cpu:
|
|
384
|
-
return [
|
|
382
|
+
return [
|
|
383
|
+
"-c:v", "libx264",
|
|
384
|
+
"-preset", "ultrafast",
|
|
385
|
+
"-tune", "zerolatency",
|
|
386
|
+
"-profile:v", "main",
|
|
387
|
+
], "libx264"
|
|
385
388
|
|
|
386
389
|
force_encoder = os.environ.get("RTMP_ENCODER", "").lower()
|
|
387
390
|
|
|
388
391
|
if force_encoder == "cpu" or force_encoder == "libx264":
|
|
389
|
-
return [
|
|
392
|
+
return [
|
|
393
|
+
"-c:v", "libx264",
|
|
394
|
+
"-preset", "ultrafast",
|
|
395
|
+
"-tune", "zerolatency",
|
|
396
|
+
"-profile:v", "main",
|
|
397
|
+
], "libx264"
|
|
390
398
|
elif force_encoder == "nvenc":
|
|
391
|
-
return [
|
|
399
|
+
return [
|
|
400
|
+
"-c:v", "h264_nvenc",
|
|
401
|
+
"-preset", "p1", # p1 = fastest, p7 = slowest
|
|
402
|
+
"-tune", "ull", # ultra-low latency
|
|
403
|
+
"-rc:v", "cbr", # constant bitrate for streaming
|
|
404
|
+
"-rc-lookahead", "0", # disable lookahead for lower latency
|
|
405
|
+
"-delay", "0", # zero delay
|
|
406
|
+
"-zerolatency", "1", # enable zero latency mode
|
|
407
|
+
"-profile:v", "main",
|
|
408
|
+
"-gpu", "0", # Use first GPU
|
|
409
|
+
], "h264_nvenc"
|
|
392
410
|
|
|
393
411
|
if self._platform.is_jetson():
|
|
394
|
-
# Jetson-specific encoder
|
|
395
|
-
return [
|
|
412
|
+
# Jetson-specific encoder with optimizations
|
|
413
|
+
return [
|
|
414
|
+
"-c:v", "h264_nvenc",
|
|
415
|
+
"-preset", "p1",
|
|
416
|
+
"-tune", "ull",
|
|
417
|
+
"-rc:v", "cbr",
|
|
418
|
+
"-rc-lookahead", "0",
|
|
419
|
+
"-delay", "0",
|
|
420
|
+
"-zerolatency", "1",
|
|
421
|
+
"-profile:v", "main",
|
|
422
|
+
], "h264_nvenc"
|
|
396
423
|
|
|
397
424
|
if sys.platform == "darwin":
|
|
398
|
-
return [
|
|
425
|
+
return [
|
|
426
|
+
"-c:v", "h264_videotoolbox",
|
|
427
|
+
"-profile:v", "main",
|
|
428
|
+
"-realtime", "1",
|
|
429
|
+
], "h264_videotoolbox"
|
|
399
430
|
|
|
400
431
|
has_nvidia = (os.environ.get("NVIDIA_VISIBLE_DEVICES") is not None or
|
|
401
432
|
os.path.exists("/proc/driver/nvidia/version"))
|
|
402
433
|
|
|
403
434
|
if has_nvidia:
|
|
404
|
-
return [
|
|
435
|
+
return [
|
|
436
|
+
"-c:v", "h264_nvenc",
|
|
437
|
+
"-preset", "p1", # p1 = fastest preset
|
|
438
|
+
"-tune", "ull", # ultra-low latency
|
|
439
|
+
"-rc:v", "cbr", # constant bitrate
|
|
440
|
+
"-rc-lookahead", "0", # disable lookahead
|
|
441
|
+
"-delay", "0", # zero delay
|
|
442
|
+
"-zerolatency", "1", # zero latency mode
|
|
443
|
+
"-profile:v", "main",
|
|
444
|
+
"-gpu", "0", # Use first GPU
|
|
445
|
+
], "h264_nvenc"
|
|
405
446
|
|
|
406
|
-
return [
|
|
447
|
+
return [
|
|
448
|
+
"-c:v", "libx264",
|
|
449
|
+
"-preset", "ultrafast",
|
|
450
|
+
"-tune", "zerolatency",
|
|
451
|
+
"-profile:v", "main",
|
|
452
|
+
], "libx264"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker-core
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Nedo Vision Worker Core 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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/cli.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
|
{nedo_vision_worker_core-0.4.0 → nedo_vision_worker_core-0.4.1}/nedo_vision_worker_core/doctor.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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|