【发布时间】:2014-11-05 23:16:14
【问题描述】:
我正在使用 AVCaptureSession 录制带音频的视频。对于短视频来说,一切似乎都可以正常工作,但由于某种原因,如果我录制的视频长度超过 12 秒,音频就无法正常工作。
【问题讨论】:
-
实际上超过 10 秒
标签: ios avcapturesession
我正在使用 AVCaptureSession 录制带音频的视频。对于短视频来说,一切似乎都可以正常工作,但由于某种原因,如果我录制的视频长度超过 12 秒,音频就无法正常工作。
【问题讨论】:
标签: ios avcapturesession
编辑(因为这个答案仍然得到支持):这个答案可以缓解问题,但问题的可能根本原因已在@jfeldman's answer 中解决。
我找到了an answer to a completely different question的解决方案。
问题在于 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
【讨论】: