Это было задано раньше, но что-то должно измениться в Swift с момента его запроса. Я пытаюсь сохранить CMSampleBuffer
объекты, возвращенные с AVCaptureSession
, которые будут обработаны позже. После некоторых экспериментов я обнаружил, что AVCaptureSession
должен повторно использовать свои ссылки CMSampleBuffer
. Когда я пытаюсь сохранить более 15 сеансов, зависает. Поэтому я думал, что сделаю копии буферов с образцами. Но я не могу заставить его работать. Вот что я написал:Создайте копию CMSampleBuffer в Swift 2.0
var allocator: Unmanaged<CFAllocator>! = CFAllocatorGetDefault()
var bufferCopy: UnsafeMutablePointer<CMSampleBuffer?>
let err = CMSampleBufferCreateCopy(allocator.takeRetainedValue(), sampleBuffer, bufferCopy)
if err == noErr {
bufferArray.append(bufferCopy.memory!)
} else {
NSLog("Failed to copy buffer. Error: \(err)")
}
Это не будет компилироваться, так как он говорит, что Variable 'bufferCopy' used before being initialized
. Я рассмотрел множество примеров, и они будут либо компилироваться, либо не работать, либо они не будут компилироваться.
Кто-нибудь видит, что я делаю неправильно здесь?
Спасибо за ответ Тим, это кажется, что это может быть хорошее решение для глубокого клона. Но я не знаю, как используется память на этом уровне. Вы знаете, где я могу найти достойный пример того, как создать глубокий клон «CMSampleBuffer» для видео и аудио? По-видимому, у Apple есть кеш из 15 'CMSampleBuffer', который перерабатывается при запуске' AVCaptureSession'. Мне, очевидно, понадобится глубокий клон, чтобы хранить свои собственные. – Rob
Я наконец понял, как использовать это, чтобы создать глубокий клон. Все методы копирования повторно использовали данные в куче, которые сохраняли бы блокировку 'AVCaptureSession'. Поэтому мне пришлось вытащить данные в объект 'NSMutableData', а затем создать новый буфер выборки. Спасибо – Rob
@Rob вы можете добавить свой код для глубокого клонирования. У меня такая же проблема, и я уже ищу полдня. – ferdyyy