重启 AVAssetWriter

Restart AVAssetWriter

我使用 AVAssetWriter 来录制视频到文件。为此,我创建了 class。 link to gist

然后在项目的某处我推送录制并开始录制视频。

func start() {
assetWriter?.startWriting()
assetWriter?.startSession(atSourceTime: kCMTimeZero)
}

如果我只录制一次视频一切正常,但是当我停止录制时

func finish() {
print("before finish")
assetWriter?.finishWriting {
  print("finish writing")
  }
}

然后尝试录制另一个视频我得到异常

[AVAssetWriter startWriting] Cannot call method when status is 2

如何配置 AVAssertWriter 来录制多个视频

不清楚您是要创建多个视频文件还是将多个视频序列附加到单个文件。如果您想要多个文件,请重新创建您的 AVAssetWriter 和朋友(即您的 AssertController class)。

如果你想要文件中有多个序列,那么要知道 AVAssetWriter 不支持停止和启动,所以解决方案是不停止。您可以控制要附加的帧以及在会话时间轴上的时间,因此在 "stopped".

时不要附加帧

你的要点使用帧数来计算缓冲区呈现时间戳,所以没有太多其他事情要做,但是如果你正在使用图像样本缓冲区,那么它们已经有自己的呈现时间戳,你需要将它们调整为使用您的会话时间轴。

当您使用 AVAssetWriter 时,您只能使用给定的 AVAssetWriter 实例一次来写入单个文件。每次写入文件时都必须使用 AVAssetWriter 的新实例。