AVCaptureSession音频不适用于长视频

时间:2014-11-05 23:16:15

标签: ios avcapturesession

我使用AVCaptureSession录制带有音频的视频。对于短视频来说,一切似乎都能正常工作,但出于某种原因,如果我录制的视频长度大于12秒,则音频无效。

4 个答案:

答案 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