AVFoundation无法录制超过34分钟的电影

时间:2013-10-03 11:16:21

标签: avfoundation osx-mountain-lion quicktime recording

使用AVFoundation录制电影时,录制将在34分钟左右自动停止,错误代码为-11813:AVErrorMaximumNumberOfSamplesForFileFormatReached

在对QuickTime File Format Specs进行一些研究后,Atom标题似乎不包含扩展大小字段。规范告诉我:

  

如果atom的size字段设置为1,则type字段后跟64位扩展大小字段,该字段包含作为64位无符号整数的atom的实际大小。当媒体数据原子的大小超过2 ^ 32字节时使用。

显然,如果扩展大小字段不存在 - 当大小字段包含原子的实际大小时,我无法写入超过2 ^ 32字节的情况 - 如下所示:

  

当size字段包含atom的实际大小时,不存在扩展大小字段。这意味着当通过添加数据修改QuickTime原子并且其大小超过2 ^ 32字节限制时,没有用于记录新原子大小的扩展大小字段。因此,在不将其内容复制到新原子的情况下,并不总是可以将原子放大到超过2 ^ 32个字节。

我正在使用AVCaptureMovieFileOutput来记录我的AVCaptureSession,其中包含视频和音频AVCaptureDeviceInput

我的问题:如何手动将size字段设置为1?或者正在使用AVCaptureMovieFileOutput错误的方法 - 我应该采用AVAssetWriter方法吗?我正在通过实时视频采集卡和音频输入录制视频和音频。

问题可由Apple自己AVRecorder的示例项目重现。更改sessionPresets并不能解决问题。

我的QTKit应用程序没有这个限制。 QuickTime Player X本身也可以记录超过这34分钟的界限。

这是一个已知问题 - 还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

问题解决了。最后,这是一个驱动程序更新问题。

一般细节:

我在Mac环境中使用Epiphan DVI2USB Solo DVI2USB 3.0 图像采集卡。
版本为3.27.7及以下版本的驱动程序无效 问题由Epiphan的新驱动程序更新3.27.8解决 在更改日志中,它明确说明了我遇到的问题。

现在可行了

技术背景:

我将问题发布到QuickTime API邮件列表。 Apple和Epiphan回复道。 Apple非常准确地解释了这一点:

  

这不是文件大小问题。这是持续时间尺度问题。 QT电影文件持续时间字段仅为32位,并以电影的时间刻度表示。在Mac OS X上,AVCaptureMovieFileOutput使用视频捕获源的时间刻度作为电影时间刻度来保持精度(用于编辑)。因此,如果您的视频设备使用的是1000000的时间刻度,那么:

     

2147483647/1000000 = 2147秒,或35分钟。

使用AVCaptureMovieFileOutput设置也无法影响时间刻度。需要使用CMSampleBufferRefAVAssetWriter设置:Apple说:

  

目前无法影响AVCaptureMovieFileOutput的时间刻度选择。它使用视频设备的时间刻度。一种解决方法是使用AVCaptureVideoDataOutput / AVCaptureAudioDataOutput来获取发送到委托回调的缓冲区,然后使用AVAssetWriter写入缓冲区,使用电影时间刻度600.它还使您有机会指定媒体时间刻度,您可以设置更低的东西,你可以录制更长的电影(见AVAssetWriterInput.h)。