【发布时间】:2015-06-25 17:33:15
【问题描述】:
我有一个相机应用程序,我试图将拍摄长度限制为正好 15 秒。
我尝试了两种不同的方法,但都没有让我满意。
第一种方法是每秒触发一个重复计时器:
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countTime:) userInfo:[NSDate date] repeats:YES];
- (void)countTime:(NSTimer*)sender {
NSDate *start = sender.userInfo;
NSTimeInterval duration = [[NSDate date] timeIntervalSinceDate:start];
NSInteger time = round(duration);
if (time > 15) {
[self capture:nil]; // this stops capture
}
}
这给了我 15 秒的视频 8/10 次,周期性的 16 秒...我在这里尝试了 NSTimeInterval 双精度和舍入整数的混合,没有明显区别...
第二种方法是在所需的持续时间后触发一次选择器,如下所示:
self.timer = [NSTimer scheduledTimerWithTimeInterval:15.0f target:self selector:@selector(capture:) userInfo:nil repeats:NO];
这只是直接调用捕获方法 - 停止相机捕获 - 并给我相同的结果......
这里有什么我忽略的吗?
现在,因为我已经测试了一些经过调整的浮点值作为上限(14.5、15.0、15.1、15.5、16.0 等),而且我几乎总是看到一个 16 秒的视频几次尝试,我开始怀疑是否只是 AVFoundation 需要一秒钟来刷新缓冲区...... ???
【问题讨论】:
-
不确定 是什么 适合这个,但它不是
NSTimer: stackoverflow.com/questions/11835023/nstimer-accuracy -
您可以将视频裁剪到 15 秒后,然后使用一个简单的 NSTimer。
-
@Linuxios 是的,这可能是正确的选择......
-
这正是你需要做的。
-
开箱即用并不确定这是否可能,但不是停止捕获(您认为可能需要 1 秒才能停止),您可以先删除输出吗?从 AVCaptureSession 的 API 中,它说您可以在会话运行时删除输出。理论上,这会立即停止输入到输出,希望它仍然可以毫无问题地保存内容?
标签: ios avfoundation nstimer nstimeinterval