AvFoundation - 如何连接AVCaptureSession和AVAssetWriter?

10
我正在尝试使用AVCaptureSession从相机捕获视频,然后我想使用AVAssetWriter将结果写入文件(具体来说,使用多个AVAssetWriters将捕获的视频划分为块,但我们不需要在这个问题上复杂化)。然而,我遇到了困难,无法确定数据实际上需要传递给AVAssetWriter的位置。在苹果开发者文档中,我只看到AVCaptureSession数据被传递到AVCaptureFileOutput。也许我错过了什么。 AVAssetWriter是否可以作为捕获会话的输出使用?如果有相关示例或代码片段(虽然不是必需的),我将不胜感激。非常感谢!
2个回答

6

5
您的确切目标是什么?因为您要求(将AVAssetWriter用作AVCaptureSession的输出)是不可能的。基本上,一个AVCaptureSession对象有输入(例如:由某些AVCaptureInput子类表示的相机)和输出(以AVCaptureOutput形式)。而AVAssetWriter不是AVCaptureOutput子类,所以无法直接从AVCaptureSession中使用它。如果您想使用AVAssetWriter,您需要使用AVCaptureFileOutput实例将数据写出,然后使用AVAssetReader读取数据,以某种方式修改您的数据,然后通过AVAssetWriter输出它。最后要记住的一件事:AVAssetReader被记录为不保证实时操作。

2
这似乎是基于我的搜索,从iPhone实时传输摄像头视频的最常见方法。既然你提到了这一点,我更加困惑为什么这是被建议的方法... - golmschenk
3
您不需要使用 AVAssetWriter 将视频分成10秒的片段。您可以使用 AVCaptureMovieFileOutput 完成此操作;将 maxRecordedDuration 属性设置为10秒,并在 -captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error: 中重新开始录制(到新文件)以获取下一个10秒。 - zadr
1
我仍然很想知道为什么其他人要使用双AVAssetWriters,但这应该是一个需要具体询问他们的问题。 - golmschenk
1
@Adam稍微解释一下,作为一个框架,AVFoundation不支持以支持@golmschenk试图实现的格式输出视频(即使用iPhone实时流传视频)。基本上,用于解码视频的重要元数据位于文件的末尾,即使设置了AVCaptureOutputexpectsMediaDataInRealTime属性。任何其他方式都会危险地假设视频文件的编写方式。 - zadr
1
@golmschenk,另一种方法不是使用AVCaptureVideoDataOutput连接到AVAssetWriter吗?就像https://www.objc.io/issues/23-video/capturing-video/中描述的那样。这样,您就不必依赖于AVAssetReader和AVCaptureFileOutput。 - Crashalot
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接