iOS-Swift-录制达到最大允许长度时的一些音频

iOS-Swift-录制达到最大允许长度时的一些音频,swift,avfoundation,avcapturemoviefileoutput,Swift,Avfoundation,Avcapturemoviefileoutput,我在Swift中实现了一个录像机,作为iOS应用程序的一部分,我将视频输出的maxRecordedDuration设置为4秒(每秒30帧): 当用户开始录制时,可能会出现两种情况: 用户决定在达到最大录制持续时间之前停止录制 在用户停止视频录制之前达到最大录制持续时间 两种情况中的任何一种都是 func captureOutput( captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: N

我在Swift中实现了一个录像机,作为iOS应用程序的一部分,我将视频输出的maxRecordedDuration设置为4秒(每秒30帧):

当用户开始录制时,可能会出现两种情况:

  • 用户决定在达到最大录制持续时间之前停止录制
  • 在用户停止视频录制之前达到最大录制持续时间
  • 两种情况中的任何一种都是

    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
            }
        }