0

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

在对QuickTime 文件格式规范进行了一些研究之后,似乎 Atom 标头不包含扩展大小字段。规范告诉我:

如果原子的大小字段设置为 1,则类型字段后跟一个 64 位扩展大小字段,其中包含原子的实际大小,为 64 位无符号整数。这在媒体数据原子的大小超过 2^32 字节时使用。

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

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

AVCaptureMovieFileOutput用来录制我AVCaptureSession的视频和音频AVCaptureDeviceInput

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

这个问题可以通过 Apple 自己的AVRecorder示例项目重现。更改 sessionPresets 并不能解决问题。

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

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

4

1 回答 1

1

问题解决了。最后是驱动更新问题。

一般细节:

我在 Mac 环境中使用 Epiphan DVI2USB SoloDVI2USB 3.0图像采集卡。
3.27.7 及以下版本的驱动程序将无法工作。Epiphan
通过新的驱动程序更新 3.27.8 解决了 该问题。在更改日志中,它明确说明了我遇到的问题。

现在它可以工作了

技术背景:

我将我的问题发布到 QuickTime API 邮件列表。苹果和 Epiphan 回答道。苹果非常准确地解释了它:

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

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

也不能通过AVCaptureMovieFileOutput设置影响时间刻度。需要使用CMSampleBufferRefAVAssetWriter设置:Apple 说:

目前没有办法影响 AVCaptureMovieFileOutput 的时间尺度选择。它使用视频设备的时间刻度。一种解决方法是使用 AVCaptureVideoDataOutput/AVCaptureAudioDataOutput 将缓冲区发送到您的委托回调,然后使用 AVAssetWriter 写入缓冲区,它使用 600 的电影时间刻度。它还让您有机会指定媒体时间刻度,您可以设置到更低的位置,以便您可以录制更长的电影(请参阅 AVAssetWriterInput.h)。

于 2013-10-25T08:18:27.350 回答