iDeveloper
iDeveloper

Reputation: 941

Flash doesn't work while recording Video in Swift 3.0

I am working on a Camera App. I have used a button to set flash mode on and off when required. This method works perfectly for Capturing still image and is not working for Video mode. Below is my code please help. TIA

class func setFlashMode(_ flashMode: AVCaptureFlashMode, for device: AVCaptureDevice) {
    if device.hasFlash && device.isFlashModeSupported(flashMode) {
        do {
            try device.lockForConfiguration()
            device.flashMode = flashMode
            device.unlockForConfiguration()
        }
        catch
        {
            print("Error:-\(error)")
        }
    }
}

Flash Button Action

@IBAction func flashButtonClicked(_ sender: UIButton)
{
 sender.isSelected = !sender.isSelected
    if !(sender.isSelected)
    {
        sender.setTitle(NSLocalizedString("OFF", comment: ""), for: UIControlState.normal)
        CameraVC.setFlashMode(AVCaptureFlashMode.off, for: self.videoDeviceInput.device)
    }
    else
    {
        sender.setTitle(NSLocalizedString("ON", comment: ""), for: UIControlState.normal)
        CameraVC.setFlashMode(AVCaptureFlashMode.on, for: self.videoDeviceInput.device)
    }
}

Video Button Action

@IBAction func videoButtonClicked(_ sender: UIButton)
{       
    self.sessionQueue.async {
        if !self.movieFileOutput.isRecording
        {
            if UIDevice.current.isMultitaskingSupported
            {
                self.backGroundRecordingID = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
            }

            let connection = self.movieFileOutput.connection(withMediaType: AVMediaTypeVideo)
            let deviceOrientation = UIDevice.current.orientation
            if UIDeviceOrientationIsPortrait(deviceOrientation) || UIDeviceOrientationIsLandscape(deviceOrientation)
            {
                connection?.videoOrientation = self.videoOrientation()
            }

            // Turning ON flash for video recording
            CameraVC.setFlashMode(AVCaptureFlashMode.on, for: self.videoDeviceInput.device)

            let mediaDirectoryURL = SBMediaInfo.mediaDirectoryPath()
            //Unique file name
            let fileName = UIDevice.current.identifierForVendor!.uuidString
            // Start recording to a temporary file.
           let outputFilePath = "\(mediaDirectoryURL.path)/\(fileName).mov"
            self.movieFileOutput.startRecording(toOutputFileURL: URL(fileURLWithPath: outputFilePath), recordingDelegate: self)
            print("\(outputFilePath)")
        }
        else
        {
            self.movieFileOutput.stopRecording()
        }
        sender.isEnabled = true
    }
}

Upvotes: 4

Views: 1610

Answers (1)

iDeveloper
iDeveloper

Reputation: 941

Used Torch Mode and it worked perfectly.

class func setTorchMode(_ torchMode: AVCaptureTorchMode, for device: AVCaptureDevice) {
    if device.isTorchModeSupported(torchMode) && device.torchMode != torchMode {
        do
        {
            try device.lockForConfiguration()
                device.torchMode = torchMode
                device.unlockForConfiguration()
        }
        catch {
            print("Error:-\(error)")
        }
    }
}

And use this as

if self.isTorchOn == true
            {
                CameraVC.setTorchMode(AVCaptureTorchMode.on, for: self.videoDeviceInput.device)
            }
            else
            {
                CameraVC.setTorchMode(AVCaptureTorchMode.off, for: self.videoDeviceInput.device)
            }

where isTorchOn is a Bool value

Upvotes: 8

Related Questions