IOS 将 UIProgressView 添加到 AVFoundation AVCaptureMovieFileOutput

Posted

技术标签:

【中文标题】IOS 将 UIProgressView 添加到 AVFoundation AVCaptureMovieFileOutput【英文标题】:IOS adding UIProgressView to AVFoundation AVCaptureMovieFileOutput 【发布时间】:2014-10-22 06:13:09 【问题描述】:

我正在使用AVCaptureMovieFileOutput 录制视频,我想添加一个UIProgressView 来表示距离视频停止录制还有多长时间。

我设置的最长持续时间为 15 秒:

CMTime maxDuration = CMTimeMakeWithSeconds(15, 50);
[[self movieFileOutput] setMaxRecordedDuration:maxDuration];

我似乎无法找到AVCaptureMovieFileOutput 是否有关于视频录制时间或录制开始时间的回调。我的问题是,如何获取录制进度的最新信息?或者,如果这不是可用的,我如何知道何时开始录制以启动计时器?

【问题讨论】:

【参考方案1】:

这是我添加UIProgressView的方法

recordingAVCaptureFileOutput 的属性,由AVCaptureMovieFileOutput 扩展

我有一个AVCaptureMovieFileOutput 类型的变量movieFileOutput,用于将数据捕获到QuickTime 影片中。

@property (nonatomic) AVCaptureMovieFileOutput *movieFileOutput;

我在记录属性中添加了一个观察者来检测记录的变化。

[self addObserver:self
           forKeyPath:@"movieFileOutput.recording"
              options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew)
              context:RecordingContext];

然后在回调方法中:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

我创建了一个在后台执行的 while 循环,然后我确保将更新分派到主线程上的视图,如下所示:

    dispatch_async([self sessionQueue], ^ // Background task started
        // While the movie is recording, update the progress bar
        while ([[self movieFileOutput] isRecording]) 
            double duration = CMTimeGetSeconds([[self movieFileOutput] recordedDuration]);
            double time = CMTimeGetSeconds([[self movieFileOutput] maxRecordedDuration]);
            CGFloat progress = (CGFloat) (duration / time);
            dispatch_async(dispatch_get_main_queue(), ^ // Here I dispatch to main queue and update the progress view.
                [self.progressView setProgress:progress animated:YES];
            );
        
    );

【讨论】:

您是否在无限循环中更新 UI?那一定是非常低效的。

以上是关于IOS 将 UIProgressView 添加到 AVFoundation AVCaptureMovieFileOutput的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7.1 中以编程方式创建的 UIProgressView 的高度被忽略(始终为 2)

将 UIProgressView 添加到 NSURLConnection?

UIProgressView 约束问题

UIProgressView

使用 iOS6 SDK 在 iOS7 上的默认 UIProgressView 渲染

iOS WKWebView添加网页加载进度条(转)