Swift

Créer l'outil de capture d'écran

Le SDK de Vonage s'attend à ce qu'un capteur vidéo personnalisé soit conforme aux normes suivantes OTVideoCapture. Créer un nouveau fichier ScreenCapturer.swift et la mettre en œuvre :

  1. Stocker une référence à la vue à capturer - même si notre application est configurée en SwiftUI, la façon la plus simple de le faire est avec UIView que nous transmettrons au Capturer, ce qui peut également être fait avec un fichier UIViewRepresentable la couverture.
  2. Rendre la vue périodiquement - utiliser drawHierarchy(in:afterScreenUpdates:).
  3. Convertir en CVPixelBuffer / OTVideoFrame - et transmet les trames à videoCaptureConsumer.

Capturer une vue

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

Copier le texte complet ScreenCapturer.swift de cet exemple de projet. Il gère :

  • Capture basée sur une minuterie à ~10 ips
  • Redimensionnement et remplissage pour la compatibilité avec l'encodeur
  • CVPixelBuffer création et OTVideoFrame livraison