Swift

Crear el capturador de pantalla

El SDK de Vonage espera una capturadora de vídeo personalizada que se ajuste a OTVideoCapture. Crear un nuevo archivo ScreenCapturer.swift y ponerlo en práctica:

  1. Almacenar una referencia a la vista a capturar - aunque nuestra aplicación está configurada en SwiftUI, la forma más sencilla de hacerlo es con UIView que pasaremos al Capturador, alternativamente esto se puede hacer con un UIViewRepresentable envoltorio.
  2. Renderizar la vista periódicamente - uso drawHierarchy(in:afterScreenUpdates:).
  3. Convertir a CVPixelBuffer / OTVideoFrame - y pasar fotogramas a videoCaptureConsumer.

Captar una vista

import Foundation
import UIKit
import OpenTok

class ScreenCapturer: NSObject, OTVideoCapture {
    var videoContentHint: OTVideoContentHint
    var videoCaptureConsumer: OTVideoCaptureConsumer?

    private let captureView: UIView
    private let captureQueue = DispatchQueue(label: "screen-capture")
    private var timer: DispatchSourceTimer
    private var capturing = false
    private var videoFrame: OTVideoFrame
    private var pixelBuffer: CVPixelBuffer?

    init(withView view: UIView) {
        self.videoContentHint = .none
        self.captureView = view
        self.timer = DispatchSource.makeTimerSource(flags: .strict, queue: captureQueue)
        self.videoFrame = OTVideoFrame(format: OTVideoFormat(argbWithWidth: 0, height: 0))
    }

    private func captureFrame() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(captureView.bounds.size, false, 0)
        defer { UIGraphicsEndImageContext() }
        captureView.drawHierarchy(in: captureView.bounds, afterScreenUpdates: false)
        return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
    }

    // Implement initCapture, start, stop, releaseCapture, isCaptureStarted, captureSettings
    // and feed frames to videoCaptureConsumer. See ScreenCapturer.swift for full implementation.
}

Copie el texto completo ScreenCapturer.swift de este proyecto de ejemplo. Maneja:

  • Captura con temporizador a ~10 fps
  • Redimensionamiento y relleno para compatibilidad con codificadores
  • CVPixelBuffer creación y OTVideoFrame entrega