Swift

Den Screen Capturer erstellen

Das Vonage SDK erwartet einen benutzerdefinierten Video-Capturer, der die folgenden Anforderungen erfüllt OTVideoCapture. Eine neue Datei erstellen ScreenCapturer.swift und umsetzen:

  1. Einen Verweis auf die zu erfassende Ansicht speichern - auch wenn unsere Anwendung in SwiftUI eingerichtet ist, ist der einfachste Weg, dies zu tun, mit UIView die wir an den Capturer übergeben, alternativ kann dies auch mit einem UIViewRepresentable Umschlag.
  2. Regelmäßiges Rendern der Ansicht - Verwendung drawHierarchy(in:afterScreenUpdates:).
  3. Umrechnen in CVPixelBuffer / OTVideoFrame - und übergibt Frames an videoCaptureConsumer.

Eine Ansicht einfangen

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

Kopieren Sie die vollständige ScreenCapturer.swift Implementierung aus diesem Beispielprojekt. Es behandelt:

  • Timer-basierte Aufnahme mit ~10 fps
  • Größenanpassung und Auffüllen für Encoder-Kompatibilität
  • CVPixelBuffer Erstellung und OTVideoFrame Lieferung