Reputation: 941
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
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