Sto impazzendo con questo - ho cercato ovunque e provato qualsiasi cosa e tutto quello che posso pensare.AVCapture appendSampleBuffer
Sto creando un'app per iPhone che utilizza AVFoundation, in particolare AVCapture per acquisire video utilizzando la fotocamera dell'iPhone.
È necessario disporre di un'immagine personalizzata sovrascritta sul feed video incluso nella registrazione.
Finora ho impostato la sessione di AVCapture, posso visualizzare il feed, accedere al frame, salvarlo come UIImage e spostare l'immagine di overlay su di esso. Quindi converti questo nuovo UIImage in un CVPixelBufferRef. annnd per ricontrollare che il bufferRef stia funzionando, l'ho riconvertito in una UIImage e visualizza l'immagine bene immobile.
Il problema si verifica quando si tenta di convertire CVPixelBufferRef in CMSampleBufferRef per aggiungere a assetWriterInput di AVCaptureSession. Il CMSampleBufferRef restituisce sempre NULL quando provo a crearlo.
Ecco la - Funzione (void) captureOutput
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
UIImage *botImage = [self imageFromSampleBuffer:sampleBuffer];
UIImage *wheel = [self imageFromView:wheelView];
UIImage *finalImage = [self overlaidImage:botImage :wheel];
//[previewImage setImage:finalImage]; <- works -- the image is being merged into one UIImage
CVPixelBufferRef pixelBuffer = NULL;
CGImageRef cgImage = CGImageCreateCopy(finalImage.CGImage);
CFDataRef image = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
int status = CVPixelBufferCreateWithBytes(NULL,
self.view.bounds.size.width,
self.view.bounds.size.height,
kCVPixelFormatType_32BGRA,
(void*)CFDataGetBytePtr(image),
CGImageGetBytesPerRow(cgImage),
NULL,
0,
NULL,
&pixelBuffer);
if(status == 0){
OSStatus result = 0;
CMVideoFormatDescriptionRef videoInfo = NULL;
result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &videoInfo);
NSParameterAssert(result == 0 && videoInfo != NULL);
CMSampleBufferRef myBuffer = NULL;
result = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault,
pixelBuffer, true, NULL, NULL, videoInfo, NULL, &myBuffer);
NSParameterAssert(result == 0 && myBuffer != NULL);//always null :S
NSLog(@"Trying to append");
if (!CMSampleBufferDataIsReady(myBuffer)){
NSLog(@"sampleBuffer data is not ready");
return;
}
if (![assetWriterInput isReadyForMoreMediaData]){
NSLog(@"Not ready for data :(");
return;
}
if (![assetWriterInput appendSampleBuffer:myBuffer]){
NSLog(@"Failed to append pixel buffer");
}
}
}
Un'altra soluzione Ho sentito parlare utilizza un AVAssetWriterInputPixelBufferAdaptor che elimina la necessità di fare la disordinata involucro CMSampleBufferRef. Tuttavia, ho setacciato forum e documenti per sviluppatori in pila e Apple e non riesco a trovare una descrizione chiara o un esempio su come impostarlo o su come usarlo. Se qualcuno ne ha un esempio funzionante potresti per favore mostrarmelo o aiutarmi a risolvere il problema di cui sopra: ho lavorato su questo non-stop per una settimana e sono a fine ingegno.
Fatemi sapere se avete bisogno di altre informazioni
Grazie in anticipo,
Michael
Ci scusiamo per la mancanza di formattazione del codice - è apparso bene nell'anteprima: S –