iOS-Swift-录制达到最大允许长度时的一些音频
我在Swift中实现了一个录像机,作为iOS应用程序的一部分,我将视频输出的maxRecordedDuration设置为4秒(每秒30帧): 当用户开始录制时,可能会出现两种情况:iOS-Swift-录制达到最大允许长度时的一些音频,swift,avfoundation,avcapturemoviefileoutput,Swift,Avfoundation,Avcapturemoviefileoutput,我在Swift中实现了一个录像机,作为iOS应用程序的一部分,我将视频输出的maxRecordedDuration设置为4秒(每秒30帧): 当用户开始录制时,可能会出现两种情况: 用户决定在达到最大录制持续时间之前停止录制 在用户停止视频录制之前达到最大录制持续时间 两种情况中的任何一种都是 func captureOutput( captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: N
func captureOutput( captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]! )
及
将被触发,因为它们是AVCaptureFileOutputRecordingDelegate
的一部分,负责响应录制视频文件过程中发生的事件(对应于Apple文档)
在用户场景1中,视频输出完全完美无瑕。但是,在用户场景2中,视频输出缺少一些音频位。换句话说,在视频结束时,视频仍在播放,但没有声音
我知道当达到最大录制持续时间时,func captureOutput(captureOutput:AVCaptureFileOutput!、DIDFINISHERDINGTOOUTPUTFILEATURL outputFileURL:NSURL!、fromConnections connections connections:[AnyObject]!、error:NSError!)
抛出以下错误:
Error Domain=AVFoundationErrorDomain Code=-11810“录制已停止”UserInfo={AverorTimeKey=CMTime:{120/30=4.000},AverorRecordingSuccessfullyFinishedKey=true,NSLocalizedDescription=录制已停止,NSLocalizedFailureReason=录制已达到允许的最大长度,NSUnderlyingError=0x175324c0{Error Domain=NSOSStatusErrorDomain Code=-16413“(null)”}
我在方法的开头添加了一些代码,以检查在抛出错误时录制是否仍然成功完成:
// Error during video recording
if let error = error, let finishedSuccessful = error.userInfo[ AVFoundation.AVErrorRecordingSuccessfullyFinishedKey ] as? Bool
{
// Video was not successfully recorded
if !finishedSuccessful
{
return
}
}
尽管代码按预期运行,但视频结果最终还是缺少了一些音频,如上所述。我想知道是否有办法修复此错误?不确定是否要修复此错误,但有一种方法可以避免。忽略
maxRecordedDuration
功能,并构建自己的倒计时计时器。这样就可以了您将确保场景1是唯一可能的场景
实现这一点有多种方法。一种非常简单的方法是执行
stopRecording()
从录制开始的那一刻起延迟X秒。问题是延迟不精确,奇怪的是maxrecordedduration也不精确。你知道有没有其他精确的方法让它完全像8.0而不是8.5366666一样停止?即使计时器也不精确…@simplexity可能是个坏主意,但也许你可以运行它计时器应在结束前1秒停止,然后运行0.01s延迟脚本,并检查是否应执行stopRecording().如果有的话,那应该会让你更接近你真正想要的时间want@simplexity太棒了。如果你找到了更好的解决方案,请发到这里。我也有同样的问题。当我录制10秒时,效果很好,但录制时间更长,文件中的音轨丢失了。
func captureOutput( captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError! )
// Error during video recording
if let error = error, let finishedSuccessful = error.userInfo[ AVFoundation.AVErrorRecordingSuccessfullyFinishedKey ] as? Bool
{
// Video was not successfully recorded
if !finishedSuccessful
{
return
}
}