UnsafeMutablePointer с видеопотоком - PullRequest
0 голосов
/ 31 января 2020

Я получаю видеопоток 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
            }
        }

    }
...