【问题标题】:Can I use AVCaptureSession to read a video from a file?我可以使用 AVCaptureSession 从文件中读取视频吗?
【发布时间】:2017-04-30 05:08:41
【问题描述】:

我正在编写一个应用程序,它使用AVCaptureSessionAVCaptureVideoDataOutput 作为输出和AVCaptureDeviceInput 和摄像头作为输入来执行一些实时视频处理。然后需求变了,现在我需要保存进来的视频文件,并处理视频(不再需要实时)

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

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

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

【问题讨论】:

    标签: ios objective-c avcapturesession


    【解决方案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。这足以以大约 25 fps 的速度“捕获”,这足以达到目的。

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

    【讨论】:

      【解决方案2】:

      这是另一篇文章,提出了一种可能的情况:

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

      基本上,使用 AVCaptureVideoDataOutputSampleBufferDelegate 方法:

      captureOutput:didOutputSampleBuffer:fromConnection:

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 2018-01-14
        • 1970-01-01
        • 2012-11-13
        • 1970-01-01
        相关资源
        最近更新 更多