Make sure that the PiCamera session is properly closed and re-opened on each stream request
This commit is contained in:
parent
258a9b57ce
commit
ac42f7eba4
3 changed files with 11 additions and 9 deletions
|
@ -17,13 +17,13 @@ from platypush.message.event.camera import CameraRecordingStartedEvent, CameraPi
|
|||
CameraRecordingStoppedEvent, CameraVideoRenderedEvent
|
||||
from platypush.plugins import Plugin, action
|
||||
from platypush.plugins.camera.model.camera import CameraInfo, Camera
|
||||
from platypush.plugins.camera.model.exceptions import CameraException, CaptureSessionAlreadyRunningException
|
||||
from platypush.plugins.camera.model.exceptions import CameraException, CaptureAlreadyRunningException
|
||||
from platypush.plugins.camera.model.writer import VideoWriter, StreamWriter
|
||||
from platypush.plugins.camera.model.writer.ffmpeg import FFmpegFileWriter
|
||||
from platypush.plugins.camera.model.writer.preview import PreviewWriter, PreviewWriterFactory
|
||||
from platypush.utils import get_plugin_name_by_class
|
||||
|
||||
__all__ = ['Camera', 'CameraInfo', 'CameraException', 'CameraPlugin', 'CaptureSessionAlreadyRunningException',
|
||||
__all__ = ['Camera', 'CameraInfo', 'CameraException', 'CameraPlugin', 'CaptureAlreadyRunningException',
|
||||
'StreamWriter']
|
||||
|
||||
|
||||
|
@ -139,11 +139,10 @@ class CameraPlugin(Plugin, ABC):
|
|||
:return: The initialized camera device.
|
||||
:raises: :class:`platypush.plugins.camera.CaptureSessionAlreadyRunningException`
|
||||
"""
|
||||
info = self._merge_info(**params)
|
||||
if device is None:
|
||||
info = self.camera_info.clone()
|
||||
device = info.device
|
||||
elif device not in self._devices:
|
||||
info = self._merge_info(**params)
|
||||
info.device = device
|
||||
else:
|
||||
info = self._devices[device].info.clone()
|
||||
|
@ -152,7 +151,7 @@ class CameraPlugin(Plugin, ABC):
|
|||
if device in self._devices:
|
||||
camera = self._devices[device]
|
||||
if camera.capture_thread and camera.capture_thread.is_alive() and camera.start_event.is_set():
|
||||
raise CaptureSessionAlreadyRunningException(device)
|
||||
raise CaptureAlreadyRunningException(device)
|
||||
|
||||
camera.start_event.clear()
|
||||
camera.capture_thread = None
|
||||
|
|
|
@ -2,7 +2,7 @@ class CameraException(RuntimeError):
|
|||
pass
|
||||
|
||||
|
||||
class CaptureSessionAlreadyRunningException(CameraException):
|
||||
class CaptureAlreadyRunningException(CameraException):
|
||||
def __init__(self, device):
|
||||
super().__init__('A capturing session on the device {} is already running'.format(device))
|
||||
|
||||
|
|
|
@ -147,10 +147,13 @@ class CameraPiPlugin(CameraPlugin):
|
|||
if not sock:
|
||||
continue
|
||||
|
||||
picam = self.open_device(**camera.info.to_dict()) if camera.object is None or camera.object.closed \
|
||||
else camera.object
|
||||
|
||||
try:
|
||||
camera.object.start_recording(sock, format=stream_format)
|
||||
picam.start_recording(sock, format=stream_format)
|
||||
while camera.stream_event.is_set():
|
||||
camera.object.wait_recording(1)
|
||||
picam.wait_recording(1)
|
||||
except ConnectionError:
|
||||
self.logger.info('Client closed connection')
|
||||
finally:
|
||||
|
@ -160,7 +163,7 @@ class CameraPiPlugin(CameraPlugin):
|
|||
except Exception as e:
|
||||
self.logger.warning('Error while closing client socket: {}'.format(str(e)))
|
||||
|
||||
self.release_device(camera)
|
||||
self.close_device(camera)
|
||||
finally:
|
||||
self._cleanup_stream(camera, server_socket, sock)
|
||||
self.logger.info('Stopped camera stream')
|
||||
|
|
Loading…
Reference in a new issue