AVAssetWriterInputPixelBufferAdaptor pixelBufferPool через некоторое время становится пустым - PullRequest
9 голосов
/ 20 июня 2011

Я использую pixelBufferPool в AVAssetWriterInputPixelBufferAdaptor для создания пиксельных буферов для использования с методом добавления.После создания 4 буферов свойство pixelBufferPool становится равным NULL;

Я настраиваю свой писатель, вход и адаптер следующим образом:

- (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;
}

и раздаю пиксельные буферы с этим:

- (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;
}

когда я заканчиваю передачу пиксельного буфера в appendPixelBuffer, я освобождаю пиксельный буфер с помощью CVPixelBufferRelease.Ни в коем случае до того, как это станет пустым, я не вызову markAsFinished, endSessionAtSourceTime или finishWriting.Кроме того, сам адаптер не имеет значения NULL.

В большинстве прочитанных мною сообщений говорится о том, что пул отсутствует с самого начала из-за неправильно настроенного адаптера, однако у меня он есть, но только на короткое время.Кто-нибудь еще видел такое поведение?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2011

У меня была такая же проблема.Как я понял, это происходит, если некоторые из CMTime s, которые вы положили в appendPixelBuffer:withPresentationTime:, равны.Это может произойти, например, если вы используете CMTimeMakeWithSeconds со слишком грубой шкалой времени.

4 голосов
/ 14 марта 2014

Это может произойти в случае ошибки адаптера пиксельного буфера.Адаптер пиксельного буфера может перейти в состояние ошибки из-за смещенных кадров или с одинаковым временем представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...