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

时间:2016-08-29 12:08:48

标签: swift avfoundation avcapturemoviefileoutput

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

self.videoOutput?.maxRecordedDuration = CMTimeMakeWithSeconds( 4, 30 )

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

  1. 用户决定在达到最长录制时间之前停止录制。
  2. 在用户停止视频录制之前达到最长录制时间。
  3. 在两种情况中的任何一种情况下

    func captureOutput( captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]! )
    

    func captureOutput( captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError! )
    

    将被触发,因为它们是AVCaptureFileOutputRecordingDelegate的一部分,func captureOutput( captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError! )负责响应录制视频文件(对应于Apple文档)过程中发生的事件。

    视频输出在用户场景1中完全无瑕疵。但是,在用户场景2中,视频输出缺少一些音频位。换句话说,在视频结束时,视频仍在播放,而没有声音。

    我知道当达到最大录制时间时, // Error during video recording if let error = error, let finishedSuccessful = error.userInfo[ AVFoundation.AVErrorRecordingSuccessfullyFinishedKey ] as? Bool { // Video was not successfully recorded if !finishedSuccessful { return } } 会引发以下错误:

      

    错误域= AVFoundationErrorDomain代码= -11810“录制停止”UserInfo = {AVErrorTimeKey = CMTime:{120/30 = 4.000},AVErrorRecordingSuccessfullyFinishedKey = true,NSLocalizedDescription =录制已停止,NSLocalizedFailureReason =录制达到最大允许长度。 NSUnderlyingError = 0x175324c0 {错误域= NSOSStatusErrorDomain代码= -16413“(null)”}}

    我在方法的开头添加了一些代码,以检查在抛出该错误时录制是否仍然成功完成:

    {{#each myMap}}
    console.log("key: " + {{@key}} + ", this: " + {{this}});
    {{/each}}
    

    即使代码按预期运行,如上所述,视频结果最终会丢失一些音频。我想知道是否有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

不确定修复错误,但有一种方法可以避免它。忽略maxRecordedDuration功能并构建自己的倒计时器。这样你就可以确保方案1是唯一可能的方案。

有多种方法可以实现这一目标。一个非常简单的可能是从录制开始的那一刻起延迟X秒执行stopRecording()