这是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:
实现包含一个错误。