Я получаю видеопоток NDI, я следовал примеру, который нашел, однако я впервые работаю с UnsafeMutablePointer
Я понимаю, что память должна управляться вручную, и я считаю, что именно в этом заключается моя проблема, как и после Через 30 секунд мое приложение зависает из-за использования 35 ГБ памяти приложения.
Может кто-нибудь посоветовать, как управлять памятью? Из того, что я прочитал, я считаю, что мне нужно отменить это выделение?
func startCapture(source: String) {
ndi.startCapture(source) // Start the capture the video from the ndi source.
captureStop = false // set the capture status
DispatchQueue.init(label: "Capture-1").async { // Capture Queue
let pixelBufferAttributes = [kCVPixelBufferCGImageCompatibilityKey: true, kCVPixelBufferCGBitmapContextCompatibilityKey: true]
while(!self.captureStop) {
var pixelBuffer : CVPixelBuffer? = nil
let outPtr = self.ndi.getVideoFrame()
if outPtr == nil {
continue;
}
let width = Int(self.ndi.width)
let height = Int(self.ndi.height)
let len = width * height
self.width = width
self.height = height
let bytesPerRow = width * 2
let ptr = UnsafeBufferPointer(start: outPtr, count: 2 * len)
_ = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, kCVPixelFormatType_422YpCbCr8, UnsafeMutableRawPointer(mutating: ptr.baseAddress!), bytesPerRow, nil, nil, pixelBufferAttributes as CFDictionary, &pixelBuffer)
let image = CIImage.init(cvImageBuffer: pixelBuffer!) // create the ciimage from current video frame buffer.
self.ciImage = image
}
}
DispatchQueue.init(label: "Player-1").async {
let tempContext = CIContext()
while (!self.captureStop) {
continue;
if let ciImage = self.ciImage {
let cgImg = tempContext.createCGImage(ciImage, from: ciImage.extent)
// get cgimage from the ciimage.
let image = NSImage(cgImage: cgImg!, size: NSSize(width: ciImage.extent.width, height: ciImage.extent.height))
mjpeg.broadcastImage = image
DispatchQueue.main.async {
self.NDIView.image = image
if self.NDIView.image != nil {
mjpeg.printNDIImage()
}
}
self.ciImage = nil
}
}
self.ciImage = nil
DispatchQueue.main.async {
self.NDIView.image = nil
}
}
}