我可以使用AVCaptureSession从文件中读取视频吗?

时间:2014-06-20 20:37:20

标签: ios objective-c avcapturesession

我正在编写一个应用程序,使用AVCaptureSession作为输出AVCaptureVideoDataOutput进行实时视频处理,并使用相机作为输入AVCaptureDeviceInput。然后需求发生变化,现在我需要保存视频文件,并处理视频(不再需要实时)

是否可以a)将AVCaptureMovieFileOutputAVCaptureVideoDataOutput附加到同一AVCaptureSession?尝试它和初步搜索都表明这是不可能的,但是这里有人可能知道一种方式。

b)使用AVCaptureMovieFileOutput录制到文件,然后将文件用作AVCaptureSession的输入而不是相机?这将允许我重用之前的所有代码。我找不到使用文件作为AVCaptureSession的输入的方法了。

如果这些方法都不可能,那么在iOS上保存和处理视频的最佳方法是什么(同时或顺序)?

2 个答案:

答案 0 :(得分:1)

我知道这篇文章差不多有三年了,但是它帮助我朝着正确的方向发展,我想我会回答一下我的所作所为。

为了捕捉"来自文件的视频,我使用了通常的AVPlayer设置,例如:

https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/02_Playback.html

然后使用AVPlayerItem addOutput方法添加AVPlayerItemVideoOutput实例,就像在GreenScreen演示中一样:

https://github.com/alokc83/iOS-Example-Collections/blob/master/WWDC_2012_SourceCode/iOS/517%20-%20Real-Time%20Media%20Effects%20and%20Processing%20during%20Playback/AVGreenScreenPlayer/AVGreenScreenPlayer/GSPlayerView.m

但是没有过滤,而是使用了CVDisplayLink,我只使用了间隔为33ms的计时器,并在AVPlayerItems currentTime值上使用了hasNewPixelBufferForItemTime和copyPixelBufferForItemTime。这足以“捕获”#34;大约25fps,这足以达到目的。

我使用Delphi实现了这一点,但是上面应该提供足够的线索,以便能够在ObjectiveC,Swift,C#或任何您支持的语言选择中做同样的事情。

答案 1 :(得分:0)

这是另一篇暗示可能出现的情况:

How do i save a video (mp4 format) using AVCaptureVideoDataOutput?

基本上,使用AVCaptureVideoDataOutputSampleBufferDelegate方法:

captureOutput:didOutputSampleBuffer:fromConnection:

根据需要处理框架。然后,您可以使用AVAssetWriter实际存储数据。

关于你的观点a),你是对的,你不能同时使用AVCaptureMovieFileOutput和AVCaptureVideoDataOutput。