我正在使用AVCaptureSession录制带音频的视频。短视频似乎一切正常,但出于某种原因,如果我录制的视频超过12秒,音频就不起作用。
编辑(因为这个答案仍在获得支持):这个答案可以缓解问题,但问题的可能根本原因在@jfeldman的答案中得到了解决。
我找到了一个完全不同的问题的答案。
问题是AVCaptureMovieFileOutput中的movieFragmentInterval
属性。
该属性的文档解释了这些片段是什么:
QuickTime影片由媒体示例和示例表组成识别它们在文件中的位置。没有示例的电影文件表不可读。
在已处理的文件中,示例表通常显示在文件的开头。它也可能出现在文件末尾的在这种情况下,标头包含指向终止录制新的电影文件时,无法由于文件的大小尚不清楚,请编写示例表。相反,必须在录制完成时写入表格。如果不采取其他操作,这意味着如果录制成功完成(例如,在崩溃的情况下),文件数据不可用(因为没有示例表)。通过定期将"电影片段"插入到电影文件中,示例表可以逐步建立起来。这意味着如果未写入文件完全而言,电影文件仍然可用(直到最后一个片段被写入)。
它还说:
默认值为10秒。设置为kCMTimeInvalid以禁用电影片段写入(通常不推荐)。
所以出于某种原因,每当写一个片段时,我的录音就会变得一团糟。我刚刚添加了行movieFileOutput.movieFragmentInterval = kCMTimeInvalid;
(其中movieFileOutput
是我添加到AVCaptureSession的AVCaptureMovieFileOutput)来禁用片段写入,音频现在可以工作了。
我们也遇到了这个问题。基本上禁用电影片段写作是可行的,但它并不能真正解释这个问题。很可能您正在使用不支持此功能的文件扩展名(如mp4
)录制输出文件。如果您传递一个扩展名为mov
的输出文件,那么使用电影片段编写应该没有问题,并且输出文件将具有音频。
更新videoFileOutput.movieFragmentInterval = kCMTimeInvalid
为我解决了这个问题。
但是,在调用startRecordingToOutputFileURL
之后,我不小心设置了movieFragmentInterval
。痛苦的一小时后,我意识到了自己的错误。对于像我这样的新手,注意这个明显的序列。
videoFileOutput.movieFragmentInterval = kCMTimeInvalid
videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)
kCMTimeInvalid现在已被弃用。这就是现在的分配方式:
videoFileOutput?.movieFragmentInterval = CMTime.invalid