我使用AVCaptureSession录制带有音频的视频。对于短视频来说,一切似乎都能正常工作,但出于某种原因,如果我录制的视频长度大于12秒,则音频无效。
答案 0 :(得分:26)
我发现解决方案为an answer to a completely different question。
问题是AVCaptureMovieFileOutput中的movieFragmentInterval
属性。
此属性的文档说明了这些片段是什么:
QuickTime影片由媒体样本和样本表组成 识别他们在文件中的位置。没有样本的电影文件 桌子不可读。
在已处理的文件中,示例表通常显示在 文件的开头。它也可能出现在文件的末尾 在哪种情况下,标题包含指向样本表的指针 结束。正在录制新的电影文件时,无法进行录制 编写示例表,因为文件的大小尚不清楚。 相反,必须在录制完成时写入表格。如果 没有采取其他行动,这意味着如果录音没有 成功完成(例如,在崩溃的情况下),文件 数据无法使用(因为没有样本表)。定期 将“影片片段”插入影片文件中,样本表即可 逐步建立起来。这意味着如果没有写入文件 完全,电影文件仍然可用(直到 最后一个片段写的。)
它还说:
默认值为10秒。设置为kCMTimeInvalid以禁用电影 片段写作(通常不推荐)。
因此,出于某种原因,无论何时写入片段,我的录音都会搞砸。我刚刚添加了行movieFileOutput.movieFragmentInterval = kCMTimeInvalid;
(其中movieFileOutput
是我已添加到AVCaptureSession的AVCaptureMovieFileOutput)以禁用片段写入,现在音频正常工作。
答案 1 :(得分:7)
我们也遇到过这个问题。基本上禁用电影片段写入将起作用,但它实际上并没有解释这个问题。您很可能使用不支持此功能的文件扩展名录制到输出文件,例如mp4
。如果传递扩展名为mov
的输出文件,则使用电影片段写入时应该没有问题,输出文件将有音频。
答案 2 :(得分:3)
更新while (reader.HasRows && reader.Read())
{
tablegen = tablegen + "<tr><td>" + reader.GetString(reader.GetOrdinal("JobTitle")) +
"</td><td>" + reader.GetString(reader.GetOrdinal("JobCategory")) + "</td><td>" + reader.GetString(reader.GetOrdinal("DatePosted")) +
"</td><td><a href = \"JobDetails.aspx?JobCode=" + reader.GetString(reader.GetOrdinal("PostID")) + "\">View/Edit Details</a></td><tr>";
}
reader.Close();
litJobPostings.Text = tablegen;
为我解决了这个问题。
但是,在调用videoFileOutput.movieFragmentInterval = kCMTimeInvalid
后,我意外地设置了movieFragmentInterval
。痛苦的一小时后,我意识到自己的错误。对于像我这样的新手,注意这个明显的序列。
startRecordingToOutputFileURL
答案 3 :(得分:0)
kCMTimeInvalid现在已弃用。现在是如何分配它:
videoFileOutput?.movieFragmentInterval = CMTime.invalid