这是protocol

目前这就是我的使用方式。但是,当我尝试访问它时会崩溃,因为我没有正确初始化它。

import Foundation
import OpenTok
import GPUImage

class FilteredPublisher:  OTPublisherKit, OTVideoCapture, GPUImageVideoCameraDelegate {
    weak var videoCaptureConsumer: OTVideoCaptureConsumer!  // Is this right?

    let imageHeight = 480
    let imageWidth = 640
    var videoCamera: GPUImageVideoCamera?
    var videoFrame = OTVideoFrame()
    var view = GPUImageView()

    override init() {
        super.init()
    }

    override init!(delegate: OTPublisherKitDelegate!) {
        super.init(delegate: delegate)
    }

    override init!(delegate: OTPublisherKitDelegate!, name: String!, audioTrack: Bool, videoTrack: Bool) {
        super.init(delegate: delegate, name: name, audioTrack: audioTrack, videoTrack: videoTrack)
    }

    override init!(delegate: OTPublisherKitDelegate!, name: String!){
        super.init(delegate: delegate, name: name)

        self.view = GPUImageView(frame: CGRectMake(0,0,1,1))
        self.videoCapture = self

        let format = OTVideoFormat()
        format.pixelFormat = OTPixelFormat.NV12
        format.imageWidth = UInt32(imageWidth)
        format.imageHeight = UInt32(imageHeight)
        self.videoFrame = OTVideoFrame(format: format)
    }


    func willOutputSampleBuffer(sampleBuffer: CMSampleBuffer!) {
        let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
        CVPixelBufferLockBaseAddress(imageBuffer!, 0)
        videoFrame?.clearPlanes()


        for var i = 0 ; i < CVPixelBufferGetPlaneCount(imageBuffer!); ++i {
            videoFrame?.planes.addPointer(CVPixelBufferGetBaseAddressOfPlane(imageBuffer!, i))
        }
        videoFrame?.orientation = OTVideoOrientation.Left

        videoCaptureConsumer.consumeFrame(videoFrame) //this crashes the app
        CVPixelBufferUnlockBaseAddress(imageBuffer!, 0)
    }
}


当我运行我的应用程序时,一切都会构建。但是,它在以下行崩溃:videoCaptureConsumer.consumeFrame(videoFrame)

是因为我没有正确初始化videoCaptureConsumer吗? OTVideoCaptureConsumer没有init(),所以我不确定该怎么做。

This是我的文件。 This是我翻译的Objective-C版本。

最佳答案

这是一个隐式展开的可选:

weak var videoCaptureConsumer: OTVideoCaptureConsumer!


作为程序员,您在这里基本上要说的是,您选择在该对象上调用方法的代码中的任何位置,该对象都不会为nil。如果在任何地方对此对象调用方法,而该对象恰好为nil,则您的应用程序将崩溃。隐含地说,如果您试图在videoCaptureConsumer上调用方法,则它是一个错误,并且它为nil。

如果在调用consumeFrame:时遇到崩溃,则按照发生的顺序,这些是故障点:


videoCaptureConsumer属性未在任何地方设置。这需要初始化一个实现OTVideoCaptureConsumer协议的对象。
所设置的对象在调用consumeFrame:之前被释放。如果没有其他人持有对该对象的引用,则会发生这种情况。
该对象仍然存在,但是它没有实现方法consumeFrame:,或者方法签名错误(例如,在应有的时候它不接受输入)。
对象的consumeFrame:实现包含一个错误。

07-24 15:03