【问题标题】:AVAssetWriter unknown errorAVAssetWriter 未知错误
【发布时间】:2013-02-25 16:17:43
【问题描述】:

我正在尝试使用 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");
    }
}

有人遇到过这样的问题吗?

【问题讨论】:

  • 你能贴出你从文件中加载资产的代码吗?
  • 我没有从文件中加载资产,我正在编写实时数据,更新了附加图像的方法。

标签: ios objective-c ipad avfoundation


【解决方案1】:

我发现了问题,它是在同一帧时间放置两帧。

【讨论】:

  • 你能详细说明一下吗?我收到此错误,无法弄清楚。非常令人沮丧。
  • 有时我会在完全相同的当前时间附加两个不同的图像。你可以记录presentTime,看看你是否有同样的情况。 [适配器 appendPixelBuffer:buffer withPresentationTime:presentTime];
  • 我想我遇到了同样的问题。这真的有帮助!如果只是错误更具体...我正在使用finishWritingWithCompletionHandler,发现在这种情况下甚至没有执行完成处理程序,这使得调试更加困难。
  • 你是怎么解决的,能不能给我sn-p的代码
【解决方案2】:

直接来自 DTS

错误 -12633 是无效时间戳

【讨论】:

  • 什么是DTS,能否提供相关页面的链接?
  • @StanJames Apple 的开发者技术支持,我通过电子邮件联系了该支持。作为注册的 iOS/Mac 开发人员,您的订阅中包含 2 次免费事件,否则它是付费支持。
【解决方案3】:

如果推送的帧有问题,也可能发生这种情况

【讨论】:

  • 是否有任何文档说明您不能乱序附加缓冲区?
  • 无。我已经通过实践弄清楚了。但这很合乎逻辑,因为数据应该按顺序流动。
  • 我问是因为我成功地附加了一些无序的缓冲区,并且在一段时间后我才收到写入错误(不是第一个或第二个无序缓冲区,更像是第 10 个或 20 日)。当我踏入这个领域时,我正在处理许多未记录的错误,OSStatus -12717 就是其中之一。我不能完全确定这是否是由于缓冲区乱序造成的,但我正在调试。
  • 可能只有在时间戳有显着差异的情况下才会出现此问题。如文档中所述,导出器尝试在流中交错视频和音频,因此在我看来,帮助他们解决这个问题是个好主意。
【解决方案4】:

如果你给AVAssetWriter一个sampleBuffer,然后销毁关联的AVAssetReader,未来的AVAssetReaders可能会在AVAssetWriter完成之前尝试重用sampleBuffer。这与AVAssetWriterInput.h 中的AVAssetWriter 文档相矛盾,据我所知,在您收到finishWritingWithCompletionHandler 中的回调之前,无法确定AVAssetWriter 是否完成,但这可能会导致OSStatus 错误 -12633。

@method appendSampleBuffer:

接收器将保留 CMSampleBuffer 直到它完成,然后释放它。将 CMSampleBuffer 或其内容传递给此方法后,请勿对其进行修改。

【讨论】:

    【解决方案5】:

    当我的像素缓冲区中的图像与输入像素缓冲区适配器根据您将 sourcePixelBufferAttributes 设置为 for(kCVPixelBufferWidthKey, kCVPixelBufferHeightKey) 所期望的宽度/高度尺寸不同时,我遇到了同样的错误。确保像素缓冲区具有相同的尺寸。就我而言,我的应用程序有时会绘制 1x1 图像,因为我打算绘制纯色图像,但我忽略了将单色像素放大到全尺寸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2017-03-16
      • 2021-09-06
      相关资源
      最近更新 更多