Swift
Erstellen der benutzerdefinierten Renderansicht
Erstellen Sie eine neue Swift-Datei mit dem Namen CustomRenderView.swift:
import UIKit
import OpenTok
class CustomRenderView: UIView {
private var renderQueue = DispatchQueue.global(qos: .userInitiated)
private var image: CGImage? = nil
func renderVideoFrame(_ frame: OTVideoFrame) {
let frameToRender = frame
renderQueue.sync {
// Release previous image if any exists
if image != nil {
image = nil
}
guard let format = frame.format else { return }
let width = Int(format.imageWidth)
let height = Int(format.imageHeight)
let bufferSize = width * height * 3
guard let rawYPlane = frameToRender.planes?.pointer(at: 0) else { return }
let yplane = rawYPlane.bindMemory(to: UInt8.self, capacity: width * height)
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
// Process frame data to create grayscale image
for i in 0..<height {
for j in 0..<width {
let pixelIndex = (i * width * 3) + (j * 3)
let yValue = yplane[(i * width) + j]
buffer[pixelIndex] = yValue
buffer[pixelIndex + 1] = yValue
buffer[pixelIndex + 2] = yValue
}
}
// Release buffer when CGDataProvider is done
let releaseCallback: CGDataProviderReleaseDataCallback = { _, data, _ in
data.deallocate()
}
guard let provider = CGDataProvider(dataInfo: nil, data: buffer, size: bufferSize, releaseData: releaseCallback) else {
buffer.deallocate()
return
}
// Create CGImage
image = CGImage(
width: width,
height: height,
bitsPerComponent: 8,
bitsPerPixel: 24,
bytesPerRow: 3 * width,
space: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue),
provider: provider,
decode: nil,
shouldInterpolate: false,
intent: .defaultIntent
)
DispatchQueue.main.async { [weak self] in
self?.setNeedsDisplay()
}
}
}
// MARK: - Drawing
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
var imgCopy: CGImage?
renderQueue.sync {
if let currentImage = image {
imgCopy = currentImage.copy()
}
}
if let img = imgCopy {
context.draw(img, in: self.bounds)
}
}
}
Wichtige Punkte:
- Verwendet eine Hintergrund-Warteschlange (
renderQueue) für die Rahmenverarbeitung, um ein Blockieren des Haupt-Threads zu vermeiden - Verarbeitet jedes Videobild zur Erstellung eines Graustufenbildes
- Erzeugt eine
CGImageaus dem verarbeiteten Frame und löst eine Neuaufzeichnung im Hauptthread aus
Grundlegendes Video-Rendering
Erfahren Sie, wie Sie einen benutzerdefinierten Videorenderer in Swift verwenden, um eine Schwarz-Weiß-Version eines Videostreams mit dem Vonage Video iOS SDK anzuzeigen.
Schritte
1
Einführung2
Erste Schritte3
Ein neues Projekt erstellen4
Hinzufügen des Vonage Video SDK5
Authentifizierung einrichten6
Verstehen der Architektur7
Erstellen der benutzerdefinierten Renderansicht8
Erstellen des benutzerdefinierten Video-Renderers9
Integration mit Vonage Video Manager10
UIView zu SwiftUI Wrapper erstellen11
Anzeige in SwiftUI12
Wie es funktioniert13
Schlussfolgerung