Пример #1
0
 def __init__(self, **kwargs):
     self.holder = None
     self.vCamera = None
     self.vRecorder = None
     self.recording = False
     super(AndroidCamera, self).__init__(**kwargs)
     self.holder = AndroidWidgetHolder(size=self.size, pos=self.pos)
     self.add_widget(self.holder)
     self.helper = CameraHelper()
Пример #2
0
	def __init__(self, **kwargs):
		self.holder = None
		self.vCamera = None
		self.vRecorder = None
		self.recording = False
		super(AndroidCamera, self).__init__(**kwargs)
		self.holder = AndroidWidgetHolder(size = self.size, pos = self.pos)
		self.add_widget(self.holder)
		self.helper = CameraHelper()
Пример #3
0
class AndroidCamera(Widget):
	__events__ = ['on_preview_frame']

	def __init__(self, **kwargs):
		self.holder = None
		self.vCamera = None
		self.vRecorder = None
		self.recording = False
		super(AndroidCamera, self).__init__(**kwargs)
		self.holder = AndroidWidgetHolder(size = self.size, pos = self.pos)
		self.add_widget(self.holder)
		self.helper = CameraHelper()

	#Stops the recording and then closes the MediaRecorder, Camera and View
	@run_on_ui_thread
	def stop(self):
		#Check if the Camera and MediaRecorder exists and if the App is recording
		if self.vCamera is None or self.vRecorder is None or not self.recording:
			return

		#Stop the MediaRecorder and close it. Lock camera so that it can be modified.
		self.vRecorder.stop()
		self.vRecorder.reset()
		self.vRecorder.release()
		self.vRecorder = None
		self.recording = False
		self.vCamera.lock()

		#Remove previewsurface and close the Camera and View
		self.vCamera.setPreviewCallback(None)
		self.vCamera.release()
		self.vCamera = None
		self.holder.view = None

	#Start the Camera and the SurfaceView
	@run_on_ui_thread
	def start(self):
		#Checks if there is no Camera running
		if self.vCamera is not None:
			return
		#Opens the rear camera (Int value 0) and sets the proper rotation
		self.vCamera = Camera.open(0)
		self.rotation = PythonActivity.mActivity.getWindowManager().getDefaultDisplay().getRotation()
		self.vCamera.setDisplayOrientation(self.helper.rotationDictionary(self.rotation))

		#Creates a 'fake' SurfaceView so that the Callback functions can be set
		self.surfView = SurfaceView(PythonActivity.mActivity)
		surfHolder = self.surfView.getHolder()

		#Sets the SurfaceHolderCallback to _on_surface_changed
		self.surfHolderCallback = SurfaceHolderCallback(self._on_surface_changed)
		surfHolder.addCallback(self.surfHolderCallback)

		#Attaches the View to the AndroidWidgetHolder
		self.holder.view = self.surfView

	#Override function for the SurfaceHolderCallback
	def _on_surface_changed(self, frmt, width, height):
		#Sets the proper width and height for the preview
		params = self.vCamera.getParameters()
		wantedSize = self.helper.getOptimalPreviewSize(params.getSupportedPreviewSizes(), width, height)
		params.setPreviewSize(wantedSize.width, wantedSize.height)
		self.vCamera.setParameters(params)

		#Now that we know the camera size, we'll create 2 buffers for faster
		#result (using Callback buffer approach, as described in Camera android
		#documentation)
		#It also reduce the GC collection
		bpp = ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8.
		buf = '\x00' * int(width * height * bpp)
		self.vCamera.addCallbackBuffer(buf)
		self.vCamera.addCallbackBuffer(buf)

		#Create a PreviewCallback to get back the onPreviewFrame into python
		self.previewCallback = PreviewCallback(self._on_preview_frame)

		#Connect the Buffer and the PreviewDisplay to the Camera
		self.vCamera.setPreviewCallbackWithBuffer(self.previewCallback)
		self.vCamera.setPreviewDisplay(self.surfView.getHolder())
		
		#Start the MediaRecorder
		if self.prepareRecorder():
			self.vRecorder.start()
			self.recording = True

	def _on_preview_frame(self, camera, data):
		self.dispatch('on_preview_frame', camera, data)
		self.vCamera.addCallbackBuffer(data)

	def on_preview_frame(self, camera, data):
		pass

	def on_size(self, instance, size):
		if self.holder:
			self.holder.size = size

	def on_pos(self, instance, pos):
		if self.holder:
			self.holder.pos = pos

	#Function to set up the MediaRecorder
	def prepareRecorder(self):
		self.vRecorder = MediaRecorder()

		self.vCamera.unlock()
		self.vRecorder.setCamera(self.vCamera)

		#Sets the proper arguments for the MediaRecorder
		self.vRecorder.setAudioSource(AudioSource.CAMCORDER)
		self.vRecorder.setVideoSource(VideoSource.CAMERA)
		self.vRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))
		self.vRecorder.setOutputFile(self.helper.getOutputMediaFile().toString())
		self.vRecorder.setPreviewDisplay(self.surfView.getHolder().getSurface())

		#Tries to connect the MediaRecorder, throws exception if it fails
		try:
			self.vRecorder.prepare()
		except Exception as ex:
			template = "An exception of type {0} occured. Arguments:\n{1!r}"
			message = template.format(type(ex).__name__, ex.args)
			print message
			return False

		return True
Пример #4
0
class AndroidCamera(Widget):
    __events__ = ['on_preview_frame']

    def __init__(self, **kwargs):
        self.holder = None
        self.vCamera = None
        self.vRecorder = None
        self.recording = False
        super(AndroidCamera, self).__init__(**kwargs)
        self.holder = AndroidWidgetHolder(size=self.size, pos=self.pos)
        self.add_widget(self.holder)
        self.helper = CameraHelper()

    #Stops the recording and then closes the MediaRecorder, Camera and View
    @run_on_ui_thread
    def stop(self):
        #Check if the Camera and MediaRecorder exists and if the App is recording
        if self.vCamera is None or self.vRecorder is None or not self.recording:
            return

        #Stop the MediaRecorder and close it. Lock camera so that it can be modified.
        self.vRecorder.stop()
        self.vRecorder.reset()
        self.vRecorder.release()
        self.vRecorder = None
        self.recording = False
        self.vCamera.lock()

        #Remove previewsurface and close the Camera and View
        self.vCamera.setPreviewCallback(None)
        self.vCamera.release()
        self.vCamera = None
        self.holder.view = None

    #Start the Camera and the SurfaceView
    @run_on_ui_thread
    def start(self):
        #Checks if there is no Camera running
        if self.vCamera is not None:
            return
        #Opens the rear camera (Int value 0) and sets the proper rotation
        self.vCamera = Camera.open(0)
        self.rotation = PythonActivity.mActivity.getWindowManager(
        ).getDefaultDisplay().getRotation()
        self.vCamera.setDisplayOrientation(
            self.helper.rotationDictionary(self.rotation))

        #Creates a 'fake' SurfaceView so that the Callback functions can be set
        self.surfView = SurfaceView(PythonActivity.mActivity)
        surfHolder = self.surfView.getHolder()

        #Sets the SurfaceHolderCallback to _on_surface_changed
        self.surfHolderCallback = SurfaceHolderCallback(
            self._on_surface_changed)
        surfHolder.addCallback(self.surfHolderCallback)

        #Attaches the View to the AndroidWidgetHolder
        self.holder.view = self.surfView

    #Override function for the SurfaceHolderCallback
    def _on_surface_changed(self, frmt, width, height):
        #Sets the proper width and height for the preview
        params = self.vCamera.getParameters()
        wantedSize = self.helper.getOptimalPreviewSize(
            params.getSupportedPreviewSizes(), width, height)
        params.setPreviewSize(wantedSize.width, wantedSize.height)
        self.vCamera.setParameters(params)

        #Now that we know the camera size, we'll create 2 buffers for faster
        #result (using Callback buffer approach, as described in Camera android
        #documentation)
        #It also reduce the GC collection
        bpp = ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8.
        buf = '\x00' * int(width * height * bpp)
        self.vCamera.addCallbackBuffer(buf)
        self.vCamera.addCallbackBuffer(buf)

        #Create a PreviewCallback to get back the onPreviewFrame into python
        self.previewCallback = PreviewCallback(self._on_preview_frame)

        #Connect the Buffer and the PreviewDisplay to the Camera
        self.vCamera.setPreviewCallbackWithBuffer(self.previewCallback)
        self.vCamera.setPreviewDisplay(self.surfView.getHolder())

        #Start the MediaRecorder
        if self.prepareRecorder():
            self.vRecorder.start()
            self.recording = True

    def _on_preview_frame(self, camera, data):
        self.dispatch('on_preview_frame', camera, data)
        self.vCamera.addCallbackBuffer(data)

    def on_preview_frame(self, camera, data):
        pass

    def on_size(self, instance, size):
        if self.holder:
            self.holder.size = size

    def on_pos(self, instance, pos):
        if self.holder:
            self.holder.pos = pos

    #Function to set up the MediaRecorder
    def prepareRecorder(self):
        self.vRecorder = MediaRecorder()

        self.vCamera.unlock()
        self.vRecorder.setCamera(self.vCamera)

        #Sets the proper arguments for the MediaRecorder
        self.vRecorder.setAudioSource(AudioSource.CAMCORDER)
        self.vRecorder.setVideoSource(VideoSource.CAMERA)
        self.vRecorder.setProfile(
            CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))
        self.vRecorder.setOutputFile(
            self.helper.getOutputMediaFile().toString())
        self.vRecorder.setPreviewDisplay(
            self.surfView.getHolder().getSurface())

        #Tries to connect the MediaRecorder, throws exception if it fails
        try:
            self.vRecorder.prepare()
        except Exception as ex:
            template = "An exception of type {0} occured. Arguments:\n{1!r}"
            message = template.format(type(ex).__name__, ex.args)
            print message
            return False

        return True