Swift: сделай скриншот с живой камерой - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь навсегда сделать фотографию программно на iOS с помощью Swift.Однако типичные методы, такие как:

let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil)

, не работают.Они фотографируют все, но не живое видео (с помощью камеры) в фоновом режиме.По-видимому, эти методы не включают живое видео с камеры в скриншоты из соображений безопасности / разрешений [живая камера на скриншоте полностью белая], но есть обходные пути.Я знаю, что есть ответ: Можно ли визуализировать AVCaptureVideoPreviewLayer в графическом контексте? , но он написан на всех Objective-C, которые я не могу прочитать или использовать, и я не уверен, как этоработает.Кроме того, были предложения использовать Metal, но я также не нашел учебник по Swift.

Может кто-нибудь показать мне (подробно) некоторый код Swift о том, как сделать снимок экрана, включая фотографиюживого видео на экране.Я уверен, что это поможет всем остальным пользователям Swift.

Спасибо


Редактировать: Код живого видео

        let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
        do {
            let input = try AVCaptureDeviceInput(device: captureDevice!)
            captureSession = AVCaptureSession()
            captureSession?.addInput(input)
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
            videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
            videoPreviewLayer?.frame = view.layer.bounds
            previewView.layer.addSublayer(videoPreviewLayer!)
            captureSession?.startRunning()

            let dataOutPut = AVCaptureVideoDataOutput()
            dataOutPut.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
            captureSession?.addOutput(dataOutPut)
        } catch {
            print(error)
        }
...