Подтвердить что ты не робот

Неизвестная ошибка AVAssetWriter

Я пытаюсь создать видеоролик с помощью AVAssetWriter. Реализованный код работает отлично, но в случайные моменты возникает проблема с писателем

AVAssetWriter *videoWriter;
...
[videoWriter finishWriting];
NSLog(@"videoWriter error %@",videoWriter.error);

Полученная ошибка:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" 
UserInfo=0x1f839cd0 {NSLocalizedDescription=The operation could not be completed,
 NSUnderlyingError=0x1e59efb0 "The operation couldn’t be completed. (OSStatus error -12633.)", 
NSLocalizedFailureReason=An unknown error occurred (-12633)}

Запись изображений:

-(void)writeFrame:(WriteableFrame*)wF
{
    if([writerInput isReadyForMoreMediaData])
    {
        CMTime presentTime = CMTimeMake(wF.frameTime, 1000);
        CGImageRef tmpImgRef = [wF.currentImage CGImage];
        buffer = [self pixelBufferFromCGImage:tmpImgRef];
        if(buffer)
        {
            [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
            CVPixelBufferRelease(buffer);
        }
    }
    else
    {
        NSLog(@"error");
    }
}

Есть ли у кого-то проблемы такие проблемы?

4b9b3361

Ответ 1

Я нашел проблему, она помещала два кадра в одно и то же время кадра.

Ответ 2

Прямой из DTS

Ошибка -12633 является InvalidTimestamp

Ответ 3

Если вы передадите sampleBuffer в AVAssetWriter, а затем уничтожьте связанный AVAssetReader, будущие AVAssetReaders могут попытаться повторно использовать sampleBuffer, прежде чем AVAssetWriter закончит с ним. Это противоречит документации AVAssetWriter в AVAssetWriterInput.h, и насколько мне известно, нет способа убедиться, что AVAssetWriter закончен, пока вы не получите обратный вызов в finishWritingWithCompletionHandler, но это может привести к Ошибка OSStatus -12633.

@method appendSampleBuffer:

Приемник сохранит CMSampleBuffer до тех пор, пока он не будет выполнен с ним, а затем отпустите его. Не изменяйте CMSampleBuffer или его содержимое после того, как вы передали его этому методу.

Ответ 4

Это также может случиться, если вытолкнутые фреймы вышли из строя

Ответ 5

Я получал ту же ошибку, когда изображение в моем пиксельном буфере не было того же размера ширины и высоты, которое ожидает адаптер адаптера входного пикселя, на основе того, для чего вы устанавливаете sourcePixelBufferAttributes для (kCVPixelBufferWidthKey, kCVPixelBufferHeightKey). Убедитесь, что буфер пикселей имеет те же размеры. В моем случае мое приложение иногда рисовало изображение 1x1, потому что я намеревался нарисовать сплошное цветное изображение, но я пренебрег тем, чтобы увеличить этот одноцветный пиксель до полного размера.