Skip to content

Commit

Permalink
Merge pull request #23 from banjun/fix-big-sur-still-photo-capture
Browse files Browse the repository at this point in the history
Fix still image capture on Big Sur
  • Loading branch information
banjun authored Oct 15, 2021
2 parents 256c0e5 + eb88350 commit b68a10c
Showing 1 changed file with 13 additions and 18 deletions.
31 changes: 13 additions & 18 deletions PhotoStudioPlayer/CaptureSession.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ extension UserDefaults {
}
}

final class CaptureSession: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate {
final class CaptureSession: NSObject, AVCapturePhotoCaptureDelegate {
let session = AVCaptureSession()
private let input: AVCaptureDeviceInput
let previewLayer: AVCaptureVideoPreviewLayer
Expand Down Expand Up @@ -50,51 +50,46 @@ final class CaptureSession: NSObject, AVCaptureVideoDataOutputSampleBufferDelega

// MARK: - Capture frame screenshots

private lazy var videoDataOutput: AVCaptureVideoDataOutput = {
let o = AVCaptureVideoDataOutput()
o.setSampleBufferDelegate(self, queue: videoDataQueue)
private lazy var photoOutput: AVCapturePhotoOutput = {
let o = AVCapturePhotoOutput()
return o
}()
private let videoDataQueue = DispatchQueue.global(qos: .userInitiated)
private let captureFolder: URL?
private var coreImageFilterForCapture: CIFilter?
var captureEnabled = false {
didSet {
if captureEnabled && session.canAddOutput(videoDataOutput) {
session.addOutput(videoDataOutput)
if captureEnabled && session.canAddOutput(photoOutput) {
session.addOutput(photoOutput)
}
if !captureEnabled {
session.removeOutput(videoDataOutput)
session.removeOutput(photoOutput)
}
}
}
private var numberOfCapturesNeeded = 0

func captureCurrentFrame() {
videoDataQueue.sync {numberOfCapturesNeeded += 1}
let settings = AVCapturePhotoSettings(format: [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA]) // populates AVCapturePhoto.pixelBuffer
photoOutput.capturePhoto(with: settings, delegate: self)
}

func openCaptureFolder() {
guard let captureFolder = captureFolder else { return }
NSWorkspace.shared.open(captureFolder)
}

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
guard let captureFolder = captureFolder else { return }
guard numberOfCapturesNeeded > 0 else { return }
numberOfCapturesNeeded -= 1

guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

let image = CIImage(cvImageBuffer: imageBuffer)
guard let pixelBuffer = photo.pixelBuffer else { return }
let image = CIImage(cvPixelBuffer: pixelBuffer)
coreImageFilterForCapture?.setValue(image, forKey: kCIInputImageKey)
guard let outputImage = coreImageFilterForCapture?.outputImage else { return }
let bitmap = NSBitmapImageRep(ciImage: outputImage)
let png = bitmap.representation(using: .png, properties: [:])
do {
try png?.write(to: captureFolder
.appendingPathComponent(UUID().uuidString)
.appendingPathExtension("png"))
.appendingPathComponent(UUID().uuidString)
.appendingPathExtension("png"))
} catch {
NSLog("%@", "\(error)")
}
Expand Down

0 comments on commit b68a10c

Please sign in to comment.