forked from platypush/platypush
Support for video_type in camera plugin
This commit is contained in:
parent
2af47372b0
commit
65d6e5a5f6
1 changed files with 30 additions and 9 deletions
|
@ -46,7 +46,7 @@ class CameraPlugin(Plugin):
|
|||
_max_stored_frames = 100
|
||||
|
||||
def __init__(self, device_id=0, frames_dir=_default_frames_dir,
|
||||
warmup_frames=_default_warmup_frames,
|
||||
warmup_frames=_default_warmup_frames, video_type=0,
|
||||
sleep_between_frames=_default_sleep_between_frames,
|
||||
max_stored_frames=_max_stored_frames,
|
||||
color_transform=_default_color_transform, *args, **kwargs):
|
||||
|
@ -67,6 +67,12 @@ class CameraPlugin(Plugin):
|
|||
camera)
|
||||
:type warmup_frames: int
|
||||
|
||||
:param video_type: Default video type to use when exporting captured
|
||||
frames to camera (default: 0, infers the type from the video file
|
||||
extension). See https://docs.opencv.org/4.0.1/dd/d9e/classcv_1_1VideoWriter.html#afec93f94dc6c0b3e28f4dd153bc5a7f0
|
||||
for a reference on the supported types (e.g. 'MJPEG', 'XVID', 'H264' etc')
|
||||
:type video_type: str or int
|
||||
|
||||
:param sleep_between_frames: If set, the process will sleep for the
|
||||
specified amount of seconds between two frames when recording
|
||||
(default: 0)
|
||||
|
@ -89,6 +95,9 @@ class CameraPlugin(Plugin):
|
|||
self.default_device_id = device_id
|
||||
self.frames_dir = os.path.abspath(os.path.expanduser(frames_dir))
|
||||
self.warmup_frames = warmup_frames
|
||||
self.video_type = cv2.VideoWriter_fourcc(*video_type) \
|
||||
if isinstance(video_type, str) else video_type
|
||||
|
||||
self.sleep_between_frames = sleep_between_frames
|
||||
self.max_stored_frames = max_stored_frames
|
||||
self.color_transform = color_transform
|
||||
|
@ -171,7 +180,7 @@ class CameraPlugin(Plugin):
|
|||
os.unlink(f)
|
||||
|
||||
|
||||
def _make_video_file(self, frames_dir, video_file):
|
||||
def _make_video_file(self, frames_dir, video_file, video_type):
|
||||
files = self._get_stored_frames_files(frames_dir)
|
||||
if not files:
|
||||
self.logger.warning('No frames found in {}'.format(frames_dir))
|
||||
|
@ -180,7 +189,7 @@ class CameraPlugin(Plugin):
|
|||
frame = cv2.imread(files[0])
|
||||
height, width, layers = frame.shape
|
||||
fps = self._get_avg_fps(frames_dir)
|
||||
video = cv2.VideoWriter(video_file, 0, fps, (width, height))
|
||||
video = cv2.VideoWriter(video_file, video_type, fps, (width, height))
|
||||
|
||||
for f in files:
|
||||
video.write(cv2.imread(f))
|
||||
|
@ -192,7 +201,7 @@ class CameraPlugin(Plugin):
|
|||
|
||||
def _recording_thread(self, duration, video_file, image_file, device_id,
|
||||
frames_dir, n_frames, sleep_between_frames,
|
||||
max_stored_frames, color_transform):
|
||||
max_stored_frames, color_transform, video_type):
|
||||
device = self._devices[device_id]
|
||||
color_transform = getattr(cv2, self.color_transform)
|
||||
|
||||
|
@ -248,7 +257,8 @@ class CameraPlugin(Plugin):
|
|||
self.logger.info('Writing frames to video file {}'.
|
||||
format(video_file))
|
||||
self._make_video_file(frames_dir=frames_dir,
|
||||
video_file=video_file)
|
||||
video_file=video_file,
|
||||
video_type=video_type)
|
||||
self.logger.info('Video file {}: rendering completed'.
|
||||
format(video_file))
|
||||
|
||||
|
@ -256,9 +266,10 @@ class CameraPlugin(Plugin):
|
|||
|
||||
|
||||
@action
|
||||
def start_recording(self, duration=None, video_file=None, device_id=None,
|
||||
frames_dir=None, sleep_between_frames=None,
|
||||
max_stored_frames=None, color_transform=None):
|
||||
def start_recording(self, duration=None, video_file=None, video_type=None,
|
||||
device_id=None, frames_dir=None,
|
||||
sleep_between_frames=None, max_stored_frames=None,
|
||||
color_transform=None):
|
||||
"""
|
||||
Start recording
|
||||
|
||||
|
@ -270,6 +281,9 @@ class CameraPlugin(Plugin):
|
|||
video file (default: None)
|
||||
:type video_file: str
|
||||
|
||||
:param video_type: Overrides the default configured ``video_type``
|
||||
:type video_file: str
|
||||
|
||||
:param device_id, frames_dir, sleep_between_frames, max_stored_frames: Set
|
||||
these parameters if you want to override the default configured ones.
|
||||
"""
|
||||
|
@ -288,6 +302,12 @@ class CameraPlugin(Plugin):
|
|||
color_transform = color_transform if color_transform \
|
||||
is not None else self.color_transform
|
||||
|
||||
if video_type is not None:
|
||||
video_type = cv2.VideoWriter_fourcc(*video_type.upper()) \
|
||||
if isinstance(video_type, str) else video_type
|
||||
else:
|
||||
video_type = self.video_type
|
||||
|
||||
self._init_device(device_id)
|
||||
self.register_handler(CameraRecordingStartedEvent, on_recording_started)
|
||||
|
||||
|
@ -300,6 +320,7 @@ class CameraPlugin(Plugin):
|
|||
self._recording_threads[device_id] = threading.Thread(
|
||||
target=self._recording_thread(duration=duration,
|
||||
video_file=video_file,
|
||||
video_type=video_type,
|
||||
image_file=None, device_id=device_id,
|
||||
frames_dir=frames_dir, n_frames=None,
|
||||
sleep_between_frames=sleep_between_frames,
|
||||
|
@ -349,7 +370,7 @@ class CameraPlugin(Plugin):
|
|||
self.register_handler(CameraPictureTakenEvent, on_picture_taken)
|
||||
self._recording_threads[device_id] = threading.Thread(
|
||||
target=self._recording_thread(duration=None, video_file=None,
|
||||
image_file=image_file,
|
||||
image_file=image_file, video_type=None,
|
||||
device_id=device_id, frames_dir=None,
|
||||
n_frames=warmup_frames,
|
||||
sleep_between_frames=None,
|
||||
|
|
Loading…
Reference in a new issue