Swift

スクリーンキャプチャーの作成

Vonage SDK は、以下の規格に準拠したカスタムビデオキャプチャを想定しています。 OTVideoCapture.新しいファイルを作成する ScreenCapturer.swift そして実行する:

  1. キャプチャするビューへの参照を保存する - 私たちのアプリがSwiftUIでセットアップされているとしても、最も簡単な方法は UIView を使うこともできる。 UIViewRepresentable ラッパー
  2. ビューを定期的にレンダリングする - 使用 drawHierarchy(in:afterScreenUpdates:).
  3. に変換する。 CVPixelBuffer / OTVideoFrame - にフレームを渡す。 videoCaptureConsumer.

景色を捉える

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

全文をコピーする ScreenCapturer.swift このサンプルプロジェクトからの実装です。これは、次のような処理を行います:

  • 10fpsでのタイマー・ベース・キャプチャー
  • エンコーダ互換性のためのリサイズとパディング
  • CVPixelBuffer 創造と OTVideoFrame 配達