| | |
| | | // |
| | | // CameraCapture.swift |
| | | // LiveProject |
| | | // |
| | | // Created by 倪路朋 on 6/27/25. |
| | | // |
| | | import AVFoundation |
| | | |
| | | class CameraCapture: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate { |
| | | private let session = AVCaptureSession() |
| | | private var videoOutput: AVCaptureVideoDataOutput? |
| | | private var input: AVCaptureDeviceInput? |
| | | var onFrame: ((CVPixelBuffer) -> Void)? |
| | | |
| | | func start() { |
| | | guard let device = AVCaptureDevice.default(for: .video), |
| | | let input = try? AVCaptureDeviceInput(device: device) else { |
| | | print("❌ 相机设备无法创建") |
| | | return |
| | | } |
| | | |
| | | self.input = input |
| | | |
| | | session.beginConfiguration() |
| | | session.sessionPreset = .hd1920x1080 |
| | | |
| | | if session.canAddInput(input) { |
| | | session.addInput(input) |
| | | } |
| | | |
| | | let output = AVCaptureVideoDataOutput() |
| | | output.videoSettings = [ |
| | | kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA |
| | | ] |
| | | output.setSampleBufferDelegate(self, queue: DispatchQueue(label: "camera.queue")) |
| | | |
| | | if session.canAddOutput(output) { |
| | | session.addOutput(output) |
| | | } |
| | | |
| | | self.videoOutput = output |
| | | |
| | | session.commitConfiguration() |
| | | session.startRunning() |
| | | print("📷 相机已开启") |
| | | } |
| | | |
| | | func captureOutput(_ output: AVCaptureOutput, |
| | | didOutput sampleBuffer: CMSampleBuffer, |
| | | from connection: AVCaptureConnection) { |
| | | guard let buffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } |
| | | let width = CVPixelBufferGetWidth(buffer) |
| | | let height = CVPixelBufferGetHeight(buffer) |
| | | //print("📷 当前帧尺寸: \(width)x\(height)") |
| | | onFrame?(buffer) |
| | | } |
| | | |
| | | func stop(){ |
| | | session.stopRunning() |
| | | session.beginConfiguration() |
| | | |
| | | if let input = input { |
| | | session.removeInput(input) |
| | | } |
| | | |
| | | if let output = videoOutput { |
| | | session.removeOutput(output) |
| | | } |
| | | |
| | | session.commitConfiguration() |
| | | |
| | | input = nil |
| | | videoOutput = nil |
| | | print("📷 相机已关闭") |
| | | } |
| | | } |