Как получить текущее изображение из WebRTC в качестве изображения?

#ios #swift #webrtc #video-capture

#iOS #swift #webrtc #захват видео

Вопрос:

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

Это мой код для создания скриншота:

 func screenShotMethod() {
    DispatchQueue.main.async {
        //Create the UIImage
        UIGraphicsBeginImageContext(self.localVideoView!.frame.size)
        self.localVideoView?.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        //Save it to the camera roll
        UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
    }
}
  

Комментарии:

1. у вас есть путь к видео? если да, то вы можете создать его эскиз с помощью AVFoundation

2. Нет, я этого не делаю, я использую SessionHandler для добавления видеодорожки с пользовательской камеры в качестве подслоя в мой localVideoView.

3. Вы нашли решение?

Ответ №1:

Вот пример кода для захвата фотографии без предварительного просмотра с камеры во время видеовызова WebRTC. Необходимо вызвать TakePicture() метод с помощью сигнала или нажатия кнопки.

 import AVFoundation
import WebRTC
import UIKit
import Foundation
class CallViewController: UIViewController{
var captureSession : AVCaptureSession?
   func TakePicture() {
        DispatchQueue.main.async { [self] in
            captureSession = AVCaptureSession()
            captureSession!.beginConfiguration()
            let photoOutput = AVCapturePhotoOutput()
            photoOutput.isHighResolutionCaptureEnabled = true
            photoOutput.isLivePhotoCaptureEnabled = false
            if let captureDevice = AVCaptureDevice.default(for: .video){
                do
                {
                    let input = try AVCaptureDeviceInput(device: captureDevice)
                    if captureSession!.canAddInput(input){
                        captureSession!.addInput(input)
                    }
                } catch let error {
                    
                }
                
                if captureSession!.canAddOutput(photoOutput){
                    captureSession!.addOutput(photoOutput)
                }
                
                let cameraLayer = AVCaptureVideoPreviewLayer()
                cameraLayer.session = captureSession
                
                captureSession!.commitConfiguration()
                captureSession!.startRunning()
                
                let photoSettings = AVCapturePhotoSettings()
                //photoSettings.flashMode = .auto //check device properties before turning on flash
                photoSettings.photoQualityPrioritization = .balanced
                photoOutput.capturePhoto(with: photoSettings, delegate: self)
                
            }
        }
    }
}
extension CallViewController: AVCapturePhotoCaptureDelegate{
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        captureSession!.stopRunning()
        captureSession = nil
        let imageData = photo.fileDataRepresentation()
        //Do the rest with image bytes
        
    }
}