从VTCompressionOutputCallback中引用“self”



我目前正在尝试使用 VideoToolbox 对来自AVCaptureVideoDataOutput的视频数据进行编码,但我在引用VTCompressionOutputCallback中的self时遇到问题。

我的代码如下:

...
var sessionRef: VTCompressionSession?
let outputCallback: VTCompressionOutputCallback = { _, _, status, _, sampleBuffer in
    guard status == noErr, let sampleBuffer = sampleBuffer else {
        return
    }
    debugPrint("[INFO]: outputCallback: sampleBuffer: (sampleBuffer)")
}
let sessionErr = VTCompressionSessionCreate(allocator: nil,
                                            width: width,
                                            height: height,
                                            codecType: kCMVideoCodecType_H264,
                                            encoderSpecification: nil,
                                            imageBufferAttributes: nil,
                                            compressedDataAllocator: nil,
                                            outputCallback: outputCallback,
                                            refcon: nil,
                                            compressionSessionOut: UnsafeMutablePointer(&sessionRef))
...

这工作正常,并且打印输出按预期进行,但是一旦我尝试在VTCompressionOutputCallback中添加对self的引用,它就会收到一个编译器错误,指出

A C function pointer cannot be formed from a closure that captures context

如何在回调中使用self

提前感谢您的帮助。

我想出了一个解决方案。

VTCompressionSessionCreate调用有一个用于outputCallbackRefCon的参数,该参数将传递给VTCompressionOutputCallback

通过把自己包裹在这样的UnsafeMutableRawPointer

let unmanagedSelf = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())

我能够在 refcon 参数下将该值传递到VTCompressionSessionCreate中。在回调中,我能够使用

let scopedSelf = Unmanaged<ViewController>.fromOpaque(unmanagedSelf).takeUnretainedValue()

相关内容

  • 没有找到相关文章