Używam pixelBufferPool w ramach AVAssetWriterInputPixelBufferAdaptor do tworzenia buforów pikseli do użycia z metodą append. Po utworzeniu 4 buforów, właściwość pixelBufferPool staje się NULL;AVAssetWriterInputPixelBufferAdaptor pixelBufferPool po pewnym czasie przechodzi NULL
konfiguracja I mój pisarz, wejście i adapter tak:
- (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;
}
i rozdać bufory pikseli z tym:
- (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;
}
kiedy skończę przekazując bufor pikseli do appendPixelBuffer í zwolnij bufor pikseli za pomocą CVPixelBufferRelease. W żadnym momencie przed tym przejściem NULL nie nazywam markAsFinished, endSessionAtSourceTime lub finishWriting. Co więcej, sam adapter nie przechodzi NULL.
Większość przeczytanych przeze mnie wpisów mówi o tym, że pula jest nieobecna od początku z powodu źle skonfigurowanego adaptera, jednak mój jest tam, ale tylko przez krótki czas. Ktoś jeszcze widział to zachowanie?
Czy kiedykolwiek byłeś w stanie to wykryć? Mając ten sam problem teraz. – RSully
Wystąpił błąd wewnętrzny. Od tak dawna nie pamiętam, co to było. Dzięki. – davidbitton
Moje hackowate rozwiązanie polega na ponownym zakodowaniu pierwszego bufora pikselowego, który czytałem przed jego dołączeniem, co wydaje się naprawić wewnętrzny problem, który miał adapter/pula. Próbuję jeszcze innych metod, ponieważ mi się to nie podoba. – RSully