3

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

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

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

  1. 用户决定在达到最大录制持续时间之前停止录制。
  2. 在用户停止视频录制之前达到最大录制持续时间。

在这两种情况中的任何一种情况下

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

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

将被触发,因为它们是 的一部分AVCaptureFileOutputRecordingDelegate,它负责响应录制视频文件过程中发生的事件(对应于 Apple 文档)。

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

我知道当达到最大录制持续时间时,func captureOutput( captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError! )会引发以下错误:

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

尽管代码按预期运行,但视频结果最后还是缺少一些音频,如上所述。我想知道是否有办法修复这个错误?

4

1 回答 1

1

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

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

于 2016-12-24T03:32:48.173 回答