AVCaptureSession 长视频的音频无法工作

17

我正在使用AVCaptureSession来录制带有音频的视频。对于短时间的视频,一切似乎都正常运作,但是如果我录制超过12秒的视频,音频就不能正常工作。


实际上,这需要超过10秒。 - Yaroslav Dukal
4个回答

34

编辑 (因为此答案仍在得到赞同): 此答案可缓解问题,但问题的根本原因在@jfeldman的回答中得到了解决


我在完全不同问题的答案中找到了解决方案

问题出在AVCaptureMovieFileOutput的movieFragmentInterval属性上。

该属性的文档解释了这些片段是什么:

QuickTime电影由媒体采样和指示它们在文件中位置的采样表组成。没有采样表的电影文件是无法读取的。

在处理后的文件中,采样表通常出现在文件的开头。它也可能出现在文件的末尾,在这种情况下,标题包含一个指向末尾采样表的指针。当正在记录新的电影文件时,由于文件大小尚未知道,因此无法编写采样表。必须在记录完成时编写该表。如果不采取其他操作,则意味着如果记录不成功(例如在崩溃事件中),则文件数据无法使用(因为没有样本表)。通过定期将“电影片段”插入电影文件,可以逐步建立采样表。这意味着如果文件未完全写入,则仍可使用电影文件(直到上次写入最后一个片段的位置)。

文档还说:

默认值为10秒。设置为kCMTimeInvalid以禁用电影片段写入(通常不建议这样做)。

某些情况下,我的录制会在写入片段时出现问题。我刚刚添加了以下代码movieFileOutput.movieFragmentInterval = kCMTimeInvalid;(其中movieFileOutput是我添加到AVCaptureSessionAVCaptureMovieFileOutput)来禁用片段写入,这样音频就可以正常工作了。


13

我们也遇到过这个问题。基本上禁用电影片段写入会起作用,但它实际上并没有解释问题的原因。很可能你正在使用不支持此功能的文件扩展名(如mp4)记录输出文件。如果你使用具有扩展名mov的输出文件,则应该可以使用电影片段写入且输出文件将包含音频,那么就不会出现问题了。


5

videoFileOutput.movieFragmentInterval = kCMTimeInvalid更新为videoFileOutput.movieFragmentInterval = kCMTimeMake(1, 100)对我有所帮助。

然而,在调用startRecordingToOutputFileURL之后,我不小心设置了movieFragmentInterval。一个痛苦的小时后,我才意识到我的错误。像我这样的新手,请注意这个显而易见的顺序。

videoFileOutput.movieFragmentInterval = kCMTimeInvalid
videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)

4

kCMTimeInvalid已被弃用,这是现在的分配方式:

videoFileOutput?.movieFragmentInterval = CMTime.invalid


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接