【问题标题】:How to use AVCaptureSession to stream live preview video, then take a photo, then return to streaming如何使用 AVCaptureSession 流式传输实时预览视频,然后拍照,然后返回流式传输
【发布时间】:2010-12-10 01:47:25
【问题描述】:

我有一个应用程序可以在拍摄静态照片之前创建自己的实时预览。该应用程序需要对图像数据进行一些处理,因此无法依赖 AVCaptureVideoPreviewLayer。使用 Apple 的示例代码让初始流工作进展顺利。当我尝试切换到更高质量的图像来拍摄快照时,问题就来了。为了响应按钮按下,我尝试重新配置会话以拍摄全分辨率照片。我尝试了很多变体,但这是我最新的示例(仍然不起作用):

- (void)sessionSetupForPhoto
{
 [session beginConfiguration];
 session.sessionPreset = AVCaptureSessionPresetPhoto;
 AVCaptureStillImageOutput *output = [[[AVCaptureStillImageOutput alloc] init] autorelease];
 for (AVCaptureOutput *output in [session outputs]) {
  [session removeOutput:output];
 }
 if ([session canAddOutput:output]){
  [session addOutput:output];
 } else {
  NSLog(@"Not able to add an AVCaptureStillImageOutput");
 }
 [session commitConfiguration];
}

在 commitConfiguration 行之后,我不断收到一条错误消息,如下所示: (也就是说,我收到了一个 AVCaptureSessionRuntimeErrorNotification 发送给我注册的观察者)

收到一个错误: NSConcreteNotification 0x19d870 {名称 = AVCaptureSessionRuntimeErrorNotification; 对象 = ; 用户信息 = { AVCaptureSessionErrorKey = "错误域=AVFoundationErrorDomain 代码=-11800 \"操作 无法完成。 (AVFoundationErrorDomain 错误 -11800.)\" UserInfo=0x19d810 {}";

XCode 中的文档表面上提供了有关错误号 (-11800) 的更多信息,“AVErrorUnknown - 错误原因未知。”;

以前我也尝试过调用 stopRunning 和 startRunning,但在观看 WWDC Session 409 后不再这样做,不鼓励这样做。当我停止和启动时,我收到一条不同的错误消息 -11819,它对应于“AVErrorMediaServicesWereReset - 由于媒体服务变得不可用,因此无法完成操作。”,这比简单的“未知”要好得多,但不一定更有帮助。

它成功添加了 AVCaptureStillImageOutput(即不发出日志消息)。

我正在 iPhone 3g (w/4.1) 和 iPhone 4 上进行测试。

这个调用发生在主线程中,这也是我最初的 AVCaptureSession 设置发生的地方。

如何避免错误?如何切换到更高分辨率拍照?

谢谢!

【问题讨论】:

  • 我遇到了同样的错误。您找到解决方法了吗?

标签: iphone avcapturesession


【解决方案1】:

由于您正在处理来自 AVCaptureSession 的视频数据,我假设您在调用 sessionSetupForPhoto 之前已连接了一个 AVCaptureVideoDataOutput。

如果是这样,您能否详细说明您在 captureOutput:didOutputSampleBuffer: 中所做的事情?由于无法查看更多内容,我猜测删除旧输出并随后设置照片质量预设可能存在问题。

此外,您在删除输出时用作迭代器的 输出 变量会隐藏静止图像输出。没问题,但它使代码更难阅读。

【讨论】:

    【解决方案2】:

    无需切换会话。只需在初始化时将AVCaptureStillImageOutput 添加到您的会话中,并在您即将捕获图像并相应地使用CMSampleBufferRef 时调用以下命令:

    captureStillImageAsynchronouslyFromConnection:videoConnection
       completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    {
    }
    

    【讨论】:

    • 请注意,如果您在 iOS 4.3 或更高版本上为 AVCaptureSessionPresetPhoto 的会话预设执行此操作,您只会获得视频预览提要。较旧的 iOS 版本不支持获取照片预设的视频预览,因此您必须做更多的工作来捕捉全尺寸照片,同时在这些较旧的 iOS 版本上进行预览。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2016-01-07
    • 2013-01-25
    • 2021-05-10
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多