0

から取得した一連のデータを維持していAVCaptureSynchronizedDataます。私が使用する方法の 1 つは、CVPixelBuffersから取得した を変更しAVCaptureSynchronizedDataます。改造中。、ビアCVPixelBufferのコピーを作成しますCVPixelBuffer

let status = CVPixelBufferCreateWithBytes(nil, scaleWidth, scaleHeight,
                                                  pixelFormat, destData,
                                                  destBytesPerRow, releaseCallback,
                                                  nil, nil, &dstPixelBuffer)

は次のreleaseCallBackように参照されます。

let releaseCallback: CVPixelBufferReleaseBytesCallback = { _, ptr in
    if let ptr = ptr {
        free(UnsafeMutableRawPointer(mutating: ptr))
    }
}

ただし、これが呼び出される回数についていくことができるようにしたいと思います。しかし、次のようなものを追加すると

var num:Int = 0
let releaseCallback: CVPixelBufferReleaseBytesCallback = { _, ptr in
    if let ptr = ptr {
        num += 1
        free(UnsafeMutableRawPointer(mutating: ptr))
    }
}

エラーが発生します

AC 関数ポインターは、コンテキストをキャプチャーするクロージャーから形成できません

可能かどうかはわかりませんが、ポインターが破棄された回数をカウントできると非常に便利です

4

1 に答える 1

1

numクロージャ キャプチャでインスタンス変数を参照するselfことは、純粋な C 関数であるコールバックでは不可能です。

同様に、func またはリテラル クロージャーのみを受け取る関数のコールバックとしてインスタンス メソッドを使用する方法と同様に、カスタム ポインター (ここでreleaseRefConは ) をコールバックに渡すことができることを使用する必要があります。

let releaseCallback: CVPixelBufferReleaseBytesCallback = { releaseRefCon, ptr in
    let mySelf = Unmanaged<YourClass>.fromOpaque(releaseRefCon!).takeUnretainedValue()
    if let ptr = ptr {
        free(UnsafeMutableRawPointer(mutating: ptr))
        mySelf.num += 1
    }
}

let releaseRefCon = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
let status = CVPixelBufferCreateWithBytes(nil, scaleWidth, scaleHeight,
                                          pixelFormat, destData,
                                          destBytesPerRow,
                                          releaseCallback, releaseRefCon,
                                          nil, &dstPixelBuffer)

インスタンス ポインター (ここ: self) から void ポインターへの変換、およびインスタンス ポインター (ここ: ) への変換については、 How to cast self to UnsafeMutablePointer<Void> in swift をmySelf参照してください。

于 2020-03-11T17:52:16.563 に答える