#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
}
}