Estoy usando pixelBufferPool dentro de un AVAssetWriterInputPixelBufferAdaptor para crear memorias intermedias de píxeles para usar con el método append. Después de crear 4 búferes, la propiedad pixelBufferPool pasa a ser NULL;AVAssetWriterInputPixelBufferAdaptor pixelBufferPool va NULL después de algún tiempo
configuración que mi escritor, y el adaptador de entrada como esta:
- (BOOL) setupRecorder {
NSError *error = nil;
if([[NSFileManager defaultManager] fileExistsAtPath:[[self tempFileURL] path]])
[[NSFileManager defaultManager] removeItemAtURL:[self tempFileURL] error:&error];
assetWriter = [[AVAssetWriter alloc] initWithURL: [self tempFileURL]
fileType:AVFileTypeQuickTimeMovie
error:&error];
if (error) {
NSLog(@"Error creating asset writer: %@", error);
[assetWriter release];
return NO;
}
// writer
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:videoWidth], AVVideoWidthKey,
[NSNumber numberWithInt:videoHeight], AVVideoHeightKey,
nil];
assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings];
NSDictionary *bufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey,
nil];
adaptor = [[AVAssetWriterInputPixelBufferAdaptor alloc] initWithAssetWriterInput:assetWriterInput sourcePixelBufferAttributes:bufferAttributes];
[adaptor retain];
assetWriterInput.expectsMediaDataInRealTime = YES;
[assetWriter addInput:assetWriterInput];
return YES;
}
y les reparto buffers de píxeles con esto:
- (CVPixelBufferRef) createPixelBufferRef {
CVPixelBufferPoolRef pixelBufferPool = adaptor.pixelBufferPool;
CVPixelBufferRef pixelBuffer = NULL;
CVReturn cvReturn = CVPixelBufferPoolCreatePixelBuffer(NULL, pixelBufferPool, &pixelBuffer);
if(cvReturn != kCVReturnSuccess)
NSLog(@"CVPixelBuffePoolCreatePixelBuffer: %d", cvReturn);
bufferCreatedCount++;
return pixelBuffer;
}
cuando he terminado de pasar el búfer de píxeles para appendPixelBuffer i suelte el buffer de píxeles con CVPixelBufferRelease. En ningún momento antes de que esto pase a NULL llamo markAsFinished, endSessionAtSourceTime o finishWriting. Además, el adaptador en sí no pasa a NULL.
La mayoría de las publicaciones que he leído hablan sobre la ausencia de la agrupación desde el principio debido a un adaptador mal configurado, sin embargo, el mío está ahí, pero solo por un corto tiempo. ¿Alguien más ha visto este comportamiento?
¿Alguna vez pudo rastrear esto? Tener el mismo problema ahora. – RSully
Hubo un error interno. Ha pasado tanto tiempo ahora que no recuerdo lo que era. Gracias. – davidbitton
Mi solución hacky es recodificar el primer buffer de píxeles que leí antes de agregarlo, lo que parece solucionar el problema interno del adaptador/grupo. Todavía estoy probando otros métodos porque no me gusta eso. – RSully