Ответ 1
Я нашел проблему, она помещала два кадра в одно и то же время кадра.
Я пытаюсь создать видеоролик с помощью 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");
}
}
Есть ли у кого-то проблемы такие проблемы?
Я нашел проблему, она помещала два кадра в одно и то же время кадра.
Прямой из DTS
Ошибка -12633 является InvalidTimestamp
Если вы передадите sampleBuffer
в AVAssetWriter
, а затем уничтожьте связанный AVAssetReader
, будущие AVAssetReaders могут попытаться повторно использовать sampleBuffer
, прежде чем AVAssetWriter
закончит с ним. Это противоречит документации AVAssetWriter
в AVAssetWriterInput.h
, и насколько мне известно, нет способа убедиться, что AVAssetWriter
закончен, пока вы не получите обратный вызов в finishWritingWithCompletionHandler
, но это может привести к Ошибка OSStatus -12633.
@method appendSampleBuffer:
Приемник сохранит CMSampleBuffer до тех пор, пока он не будет выполнен с ним, а затем отпустите его. Не изменяйте CMSampleBuffer или его содержимое после того, как вы передали его этому методу.
Это также может случиться, если вытолкнутые фреймы вышли из строя
Я получал ту же ошибку, когда изображение в моем пиксельном буфере не было того же размера ширины и высоты, которое ожидает адаптер адаптера входного пикселя, на основе того, для чего вы устанавливаете sourcePixelBufferAttributes для (kCVPixelBufferWidthKey, kCVPixelBufferHeightKey). Убедитесь, что буфер пикселей имеет те же размеры. В моем случае мое приложение иногда рисовало изображение 1x1, потому что я намеревался нарисовать сплошное цветное изображение, но я пренебрег тем, чтобы увеличить этот одноцветный пиксель до полного размера.