2016-02-17 8 views
4

Это было задано раньше, но что-то должно измениться в 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. Я рассмотрел множество примеров, и они будут либо компилироваться, либо не работать, либо они не будут компилироваться.

Кто-нибудь видит, что я делаю неправильно здесь?

ответ

1

Буквально вы пытаетесь использовать переменную bufferCopy перед ее инициализацией.

Вы объявили для него тип, но не выделили память, на которую он указывает.

Вы должны вместо этого создать CMSampleBuffers используя следующий вызов https://developer.apple.com/library/tvos/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferCreate

Вы должны быть в состоянии скопировать буфер в это, то (при условии, что формат буфера соответствует тот, который вы копируете из).

+1

Спасибо за ответ Тим, это кажется, что это может быть хорошее решение для глубокого клона. Но я не знаю, как используется память на этом уровне. Вы знаете, где я могу найти достойный пример того, как создать глубокий клон «CMSampleBuffer» для видео и аудио? По-видимому, у Apple есть кеш из 15 'CMSampleBuffer', который перерабатывается при запуске' AVCaptureSession'. Мне, очевидно, понадобится глубокий клон, чтобы хранить свои собственные. – Rob

+1

Я наконец понял, как использовать это, чтобы создать глубокий клон. Все методы копирования повторно использовали данные в куче, которые сохраняли бы блокировку 'AVCaptureSession'. Поэтому мне пришлось вытащить данные в объект 'NSMutableData', а затем создать новый буфер выборки. Спасибо – Rob

+0

@Rob вы можете добавить свой код для глубокого клонирования. У меня такая же проблема, и я уже ищу полдня. – ferdyyy

5

Вы можете просто передать CMSampleBuffer? переменную (которая, в качестве опции, неявно инициализирована с nil) в качестве Inout аргумента с &:

var bufferCopy : CMSampleBuffer? 
let err = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &bufferCopy) 
if err == noErr { 
    // ... 
} 
+2

Спасибо. Это ответило на проблему, которую я поставил выше для получения кода для компиляции. И когда я тестировал код, получается, что он должен быть мелким клоном. Данные о том, что новый 'CMSampleBuffer' был в том же месте, что и предыдущий. Поэтому, когда я запускал «AVCaptureSession», он отправил 15 образцов и снова заблокирован, потому что я держал ссылку на базовое местоположение данных. Любая идея, как я могу создать глубокий клон, чтобы я мог дублировать данные в новое место в памяти? Благодаря! – Rob