2016-02-17 1 views
4

Cela a déjà été demandé, mais quelque chose doit avoir changé dans Swift depuis sa création. J'essaye de stocker CMSampleBuffer objets retournés d'un AVCaptureSession pour être traité plus tard. Après quelques expérimentations j'ai découvert que AVCaptureSession doit réutiliser ses références . Quand j'essaye de garder plus de 15 la session se bloque. J'ai donc pensé que je ferais des copies des tampons d'échantillons. Mais je n'arrive pas à le faire fonctionner. Voici ce que je l'ai écrit:Créer une copie de CMSampleBuffer dans 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)") 
} 

Cela ne compile pas parce qu'il dit que Variable 'bufferCopy' used before being initialized. J'ai regardé beaucoup d'exemples et ils compileront et ne fonctionneront pas ou ils ne compileront pas.

Quelqu'un voit-il ce que je fais mal ici?

Répondre

1

Littéralement, vous essayez d'utiliser la variable bufferCopy avant son initialisation.

Vous avez déclaré un type pour cela, mais n'avez pas alloué la mémoire vers laquelle il pointe.

Vous devriez plutôt créer CMSampleBuffers en utilisant l'appel suivant https://developer.apple.com/library/tvos/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferCreate

Vous devriez être en mesure de copier le tampon dans ce alors (tant que le format du tampon correspond à celui que vous copiez à partir).

+1

Merci pour la réponse Tim, cela semble, il peut être une bonne solution pour un clone profond. Mais je ne suis pas très familier avec la façon dont la mémoire est utilisée à ce niveau. Savez-vous où je pourrais trouver un exemple décent de la façon de créer un clone profond d'un 'CMSampleBuffer' pour la vidéo et l'audio? Apple détient apparemment un cache de 15 'CMSampleBuffer's qu'il recycle lors de l'exécution de' AVCaptureSession'. Je vais évidemment avoir besoin de cloner en profondeur pour stocker le mien. – Rob

+1

J'ai finalement compris comment l'utiliser pour créer un clone profond. Toutes les méthodes de copie ont réutilisé les données dans le tas qui maintenaient verrouiller le 'AVCaptureSession'. J'ai donc dû extraire les données dans un objet 'NSMutableData', puis créer un nouveau buffer d'échantillons. Merci – Rob

+0

@Rob pourriez-vous ajouter votre code pour le clonage en profondeur. J'ai le même problème et je cherche déjà une demi-journée. – ferdyyy

5

Vous pouvez simplement passer une variable CMSampleBuffer? (qui, en option, est implicitement initialisées avec nil) comme argument inout avec &:

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

Merci. Cela a répondu au problème que j'avais ci-dessus pour obtenir le code à compiler. Et quand j'ai testé le code, il s'avère que ce doit être un clone peu profond. Les données que le nouveau 'CMSampleBuffer' détenait était dans le même emplacement que le précédent. Donc quand j'ai couru le 'AVCaptureSession' il a envoyé l'échantillon 15 et s'est verrouillé encore parce que je tenais la référence à l'emplacement de données sous-jacent. Toute idée de comment je peux créer un clone profond afin que je puisse dupliquer les données dans un nouvel emplacement en mémoire? Merci! – Rob