Ios appendPixelBuffer出错:withPresentationTime:

Ios appendPixelBuffer出错:withPresentationTime:,ios,iphone,objective-c,Ios,Iphone,Objective C,我的AVAssetWriter和AvassetWriterInputPixelBufferAdapter有问题。一段时间后(此时间可能从10秒到60秒不等),appendPixelBuffer:withPresentationTime:返回NO,并出现以下错误: Error Domain=AVFoundationErrorDomain Code=-11800“操作无法完成”UserInfo=0x16520f50{NSLocalizedDescription=操作无法完成,NSUnderlying

我的AVAssetWriter和AvassetWriterInputPixelBufferAdapter有问题。一段时间后(此时间可能从10秒到60秒不等),appendPixelBuffer:withPresentationTime:返回NO,并出现以下错误:

Error Domain=AVFoundationErrorDomain Code=-11800“操作无法完成”UserInfo=0x16520f50{NSLocalizedDescription=操作无法完成,NSUnderlyingError=0x16527f90“操作无法完成。(OSStatus错误-12780.)”,NSLocalizedFailureReason=发生未知错误(-12780)}

请不要把我引向stackoverflow的另一个问题。因为我没有答案。不,我不会同时附加两个帧。记录了几次时间

我使用的是实时数据,writerInput需要它

只有为我的AVAssetWriter设置电影片段间隔,并且仅在我的iPhone 5s上,并且我在不同的iPhone 5s上测试了不同的iOS版本(7.1和7.0.5/6),才会发生此错误。但在早期的手机上工作正常。如果我把那句话注释掉,一切都会好的。但我的应用程序中有一个重要的目的,我需要一个电影片段间隔。然后我就这样做了

    _writer = [AVAssetWriter assetWriterWithURL:recordingFileURL fileType:AVFileTypeMPEG4 error:error];
_writer.movieFragmentInterval = CMTimeMake(3, 1);
我的另一个代码看起来像这样

- (BOOL)writeVideoFrameAtTime:(CMTime)time image:(CGImageRef)image error:(NSError **)error {

if (!_started) {
_started = YES;
CRDebug(@"Start writing");
[_writer startWriting];
[_writer startSessionAtSourceTime:time];
[_video startSessionWithPresentationTime:time];
}

if (![_writerInput isReadyForMoreMediaData]) {
 CRDebug(@"Not ready for more data (video)");
return NO;
}

if (!_pixelBuffer) {
 CVReturn status = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, _bufferAdapter.pixelBufferPool, &_pixelBuffer);
if (status != kCVReturnSuccess) {
  if (_writer.error) {
    if (error) *error = _writer.error;
    CRWarn(@"Error creating pixel buffer: %@", _writer.error);
  } else {
    CRSetError(error, 0, @"Error creating pixel buffer");
  }
  return NO;
}
}

CVPixelBufferLockBaseAddress(_pixelBuffer, 0);
uint8_t *pixels = CVPixelBufferGetBaseAddress(_pixelBuffer);
CGDataProviderRef dataProvider = CGImageGetDataProvider(image);
CFDataRef imageData = CGDataProviderCopyData(dataProvider);
CFDataGetBytes(imageData, CFRangeMake(0, CFDataGetLength(imageData)), pixels);

if (_bufferAdapter && ![_bufferAdapter appendPixelBuffer:_pixelBuffer withPresentationTime:time]) {
if (_writer.error) {
  if (error) *error = _writer.error;
  CRWarn(@"Error appending pixel buffer: %@", _writer.error);
} else {
  CRSetError(error, 0, @"Error appending pixel buffer");
}
  CVPixelBufferUnlockBaseAddress(_pixelBuffer, 0);
  CFRelease(imageData);
  return NO;
}

CVPixelBufferUnlockBaseAddress(_pixelBuffer, 0);
CFRelease(imageData);
return YES;
}
提前谢谢。感谢您的帮助

编辑:
就这个问题联系了苹果公司,他们希望我将其作为缺陷报告归档。我会尽快这么做,等我知道更多情况后再联系你们。

我遇到了完全相同的问题。当我将
AVFileTypeMPEG4
movieFragmentInterval
组合时,它会随机产生与您看到的相同的错误消息。我在资产编写的各个方面都做了日志记录,而且我绝对不会编写重复的示例


通过将
AVFileTypeMPEG4
更改为
AVFileTypeQuickTimeMovie
,我终于让它工作了。我可以用MPEG4可靠地复制它(尽管它所花费的时间是随机的),但QuickTime似乎总是工作无误。我知道如果你真的想要mp4文件,这不一定能解决你的问题,但我想我会分享我的发现。

如果我被允许的话,我会用评论。这个答案对so+1有帮助。Quicktime与intervall或mp4都不工作,任何其他都可能导致令人不安的评论,或者您是否有需要跟踪的错误?iOS 9.0.2中仍然存在!!!