如何让自动对焦在第二个 AVCaptureSession 中工作而不重新创建会话?

2023-12-02

当我创建第二个 AVCaptureSession 时,自动对焦不适用于第一个 AVCaptureSession。要创建的第二个会话是自动对焦工作的会话,而第一个创建的会话则不自动对焦。

我希望任一会话在另一个会话停止后启动时都能够自动对焦,就像两个会话的自动白平衡和自动曝光一样。如果您使用下面的示例代码观察日志窗口,您可以看到通过的键值观察消息;但当顶级会话运行时,永远不会出现焦点变化消息。

旁注:不幸的是,我正在使用的第三方库中有一个错误,它阻止我在会话之间切换时完全重新创建会话(它泄漏了 AVCaptureSessions,最终导致应用程序被终止)。完整的故事是,这个库正在为我创建一个捕获会话,它有一个公共 API 来启动和停止会话,我希望创建另一个会话。下面的代码演示了该问题,但没有使用第三方库。

我创建了一个测试应用程序,其中包含下面列出的代码和一个 XIB 文件,该文件有两个视图,一个在另一个视图之上,还有一个连接到 switchSessions 方法的按钮来演示该问题。

这可能与这里描述的问题有关,焦点(自动对焦)在相机中不起作用(AVFoundation AVCaptureSession),尽管没有提及两个捕获会话。

头文件:

#import <UIKit/UIKit.h>

@class AVCaptureSession;
@class AVCaptureStillImageOutput;
@class AVCaptureVideoPreviewLayer;
@class AVCaptureDevice;
@class AVCaptureDeviceInput;

@interface AVCaptureSessionFocusBugViewController : UIViewController {

    IBOutlet UIView *_topView;
    IBOutlet UIView *_bottomView;

    AVCaptureDevice *_device;

    AVCaptureSession *_topSession;

    AVCaptureStillImageOutput *_outputTopSession;
    AVCaptureVideoPreviewLayer *_previewLayerTopSession;
    AVCaptureDeviceInput *_inputTopSession;

    AVCaptureSession *_bottomSession;

    AVCaptureStillImageOutput *_outputBottomSession;
    AVCaptureVideoPreviewLayer *_previewLayerBottomSession;
    AVCaptureDeviceInput *_inputBottomSession;
}

- (IBAction)switchSessions:(id)sender;

@end

实施文件:

#import "AVCaptureSessionFocusBugViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface AVCaptureSessionFocusBugViewController ()

- (void)setupCaptureSession:(AVCaptureSession **)session
                     output:(AVCaptureStillImageOutput **)output
               previewLayer:(AVCaptureVideoPreviewLayer **)previewLayer
                      input:(AVCaptureDeviceInput **)input
                       view:(UIView *)view;

- (void)tearDownSession:(AVCaptureSession **)session
                 output:(AVCaptureStillImageOutput **)output
           previewLayer:(AVCaptureVideoPreviewLayer **)previewLayer
                  input:(AVCaptureDeviceInput **)input
                   view:(UIView *)view;

@end

@implementation AVCaptureSessionFocusBugViewController

- (IBAction)switchSessions:(id)sender
{
    if ([_topSession isRunning]) {
        [_topSession stopRunning];
        [_bottomSession startRunning];
        NSLog(@"Bottom session now running.");
    }
    else {
        [_bottomSession stopRunning];
        [_topSession startRunning];
        NSLog(@"Top session now running.");
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context
{
    NSLog(@"Observed value for key at key path %@.", keyPath);
    // Enable to confirm that the focusMode is set correctly.
    //NSLog(@"Autofocus for the device is set to %d.", [_device focusMode]);
}

- (void)viewDidLoad {
    [super viewDidLoad];

    _device = [[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] retain];

    [self setupCaptureSession:&_topSession 
                       output:&_outputTopSession
                 previewLayer:&_previewLayerTopSession
                        input:&_inputTopSession
                         view:_topView];

    [self setupCaptureSession:&_bottomSession 
                       output:&_outputBottomSession
                 previewLayer:&_previewLayerBottomSession
                        input:&_inputBottomSession
                         view:_bottomView];

    // NB: We only need to observe one device, since the top and bottom sessions use the same device.
    [_device addObserver:self forKeyPath:@"adjustingFocus" options:NSKeyValueObservingOptionNew context:nil];
    [_device addObserver:self forKeyPath:@"adjustingExposure" options:NSKeyValueObservingOptionNew context:nil];
    [_device addObserver:self forKeyPath:@"adjustingWhiteBalance" options:NSKeyValueObservingOptionNew context:nil];

    [_topSession startRunning];
    NSLog(@"Starting top session.");
}


- (void)setupCaptureSession:(AVCaptureSession **)session
                     output:(AVCaptureStillImageOutput **)output
               previewLayer:(AVCaptureVideoPreviewLayer **)previewLayer
                      input:(AVCaptureDeviceInput **)input
                       view:(UIView *)view
{    
    *session = [[AVCaptureSession alloc] init];

    // Create the preview layer.
    *previewLayer = [[AVCaptureVideoPreviewLayer layerWithSession:*session] retain];

    [*previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    [*previewLayer setFrame:[view bounds]];

    [[view layer] addSublayer:*previewLayer];

    // Configure the inputs and outputs.
    [*session setSessionPreset:AVCaptureSessionPresetMedium];

    NSError *error = nil;

    *input = [[AVCaptureDeviceInput deviceInputWithDevice:_device error:&error] retain];

    if (!*input) {
        NSLog(@"Error creating input device:%@", [error localizedDescription]);
        return;
    }

    [*session addInput:*input];

    *output = [[AVCaptureStillImageOutput alloc] init];

    [*session addOutput:*output];

    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil];

    [*output setOutputSettings:outputSettings];

    [outputSettings release];
}

- (void)viewDidUnload {
    [_topView release];
    _topView = nil;

    [_bottomView release];
    _bottomView = nil;

    [_device release];
    _device = nil;

    [self tearDownSession:&_topSession
                   output:&_outputTopSession
             previewLayer:&_previewLayerTopSession
                    input:&_inputTopSession
                     view:_topView];

    [self tearDownSession:&_bottomSession 
                       output:&_outputBottomSession
                 previewLayer:&_previewLayerBottomSession
                        input:&_inputBottomSession
                         view:_bottomView];
}

- (void)tearDownSession:(AVCaptureSession **)session
                 output:(AVCaptureStillImageOutput **)output
           previewLayer:(AVCaptureVideoPreviewLayer **)previewLayer
                  input:(AVCaptureDeviceInput **)input
                   view:(UIView *)view
{
    if ([*session isRunning]) {
        [*session stopRunning];
    }

    [*session removeOutput:*output];

    [*output release];
    *output = nil;

    [*session removeInput:*input];

    [*input release];
    *input = nil;

    [*previewLayer removeFromSuperlayer];

    [*previewLayer release];
    *previewLayer = nil;

    [*session release];
    *session = nil;
}

@end

Apple 技术支持已确认不支持创建两个同时捕获会话。您必须拆除一个,然后创建另一个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让自动对焦在第二个 AVCaptureSession 中工作而不重新创建会话? 的相关文章

  • 如何通过我的 ios 应用程序的指示打开苹果地图应用程序

    我的目标是从 ios 应用程序打开带有方向的地图应用程序 我可以打开地图应用程序 但它没有显示方向 我编写的代码如下 NSString mystr NSString alloc initWithFormat http maps apple
  • 基于 JavaScript 的 iPhone UI 框架

    我们有一个基于推送的网络应用程序 最近 我们计划为其制作一个 iPhone 应用程序 就像 Facebook 拥有 iPhone 应用程序和网站一样 我们正在寻找一个可以让我们快速前进的 UI 框架 我翻阅过PhoneGap http ww
  • Excel 工作表到 iPhone 数据 -- A 点到 B 点

    尽可能简单 我有一个非常简单的 Excel 电子表格 只有 1000 多条记录 我想将其用作 iPhone 应用程序的静态数据源 最好的进攻计划是什么 我心中的可能性 1 直接读取XLS作为数据源 是否有Obj C库用于此 2 将XLS 转
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • iPhone AVFoundation 相机方向

    我一直在绞尽脑汁地试图让 AVFoundation 相机以正确的方向 即设备方向 捕获图片 但我无法让它工作 我看过教程 看过 WWDC 演示 还下载了 WWDC 示例程序 但即使这样也没有成功 我的应用程序的代码是 AVCaptureCo
  • iOS 4.3 上的cameraOverlayView 问题

    我使用带有cameraOverlayView的选择器控制器在相机视图中显示产品的图像 在应用到覆盖层之前 产品图像会调整大小 它在 iOS 4 2 上运行良好 但在 iOS 4 3 上产品图像显示为全尺寸 pickerController
  • 步行、自行车和公共交通路线以及每种方式所需的时间,iPhone

    我正在使用以下网址来获取两个位置之间的行车路线 NSString apiUrlStr NSString stringWithFormat http maps google com maps output dragdir saddr dadd
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • 应用程序更新时的 iPhone 数据迁移

    我正在开发一个 iPhone 应用程序 它使用 sqlite 来存储应用程序和用户数据 这是该应用程序的第一个版本 我想知道我需要做什么来为该应用程序的未来版本做准备 这够了吗 1 确保 XCode 项目设置中的应用程序版本正确 2 在sq
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的
  • Objective C (iphone) 关于发布的问题

    如果我创建一个视图 并将其添加为子视图并将其添加到数组中 是否必须释放它两次 UIView cat UIView alloc initWithFrame someFrame self view addSubview cat self ani
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • 从plist文件中读取数据

    我正在尝试为我的 iPhone 应用程序实现保存状态 我有一个名为 SaveData plist 的 plist 文件 我可以通过以下方式读取它 NSString pListPath2 bundle pathForResource Save
  • 游戏中心邀请处理程序,它属于哪里?

    我已经搜索了该网站并发现了这个 GameCenter 邀请处理程序 https stackoverflow com questions 4639284 gamecenter invitation handler He says 正如文档中所
  • UiTextField 和 resignFirstResponder

    我有一个奇怪的设置 我有一个View called View1 and a ViewController call 视图控制器1 in IB View1是 的孩子视图控制器1 Inside View1 我使用代码创建UITextField并
  • HTML 分页

    有没有html分页的开源项目 我正在为 iPhone 开发一个应用程序 我想在 UIWebView 上显示 HTML 文件 并且不希望用户向下滚动以查看屏幕上未显示的剩余内容 我想在第二个 UIWebView 上显示剩余的内容 我怎样才能做
  • 核心数据对多关系。它们是延迟加载吗?

    我在核心数据 适用于 iPhone 中有典型的模型 其中包含部门和员工 部门 gt gt 员工 我不想每次加载时都加载一个部门的所有员工 所以我想将员工创建为获取的属性 我想我可以定义一些像这样的谓词 employee deparmentI
  • Facebook iPhone SDK:上传图像时显示进度条

    我想在我的 iPhone 应用程序将图像上传到 Facebook 时显示进度条 是否可以 我可以对我发出的每个 FBRequest 执行此操作吗 我还使用 FBRequest 来检查扩展权限 有时需要花费很多时间 谢谢 对于进度条 您可以做
  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn

随机推荐

  • tkinter 如何将小部件向右对齐,而与左侧小部件的长度无关?

    我想将条目小部件向右对齐 而与左侧标签的宽度无关 ID 标题的宽度应该不重要 无论标题的宽度是多少 条目小部件都应该对齐 这是我的代码 import tkinter as tk from tkinter import ttk root tk
  • 如何在Android中将两个音频文件合并为一个[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想合并两个音频文件 A音频文件 B音频文件 AB音频文件 经过一番搜索后 我认为以下步骤会起作用 使用 AudioTrack 从音频文件中解码 PCM 结合PCM 上述步骤是否正确 如果
  • Facebook 嵌入视频与 iframe 无法正常工作

    我们使用 iframe 在我们的网站中嵌入 Facebook 视频 之前工作正常 但从最近几天开始 网站无法加载视频 我们也尝试过使用简单的网页 但没有成功 下面是我们正在使用的代码 如果有人可以提供快速帮助 请告诉我 只需使用此链接 这对
  • 有效地替换字符串中的所有重音字符?

    为了一个穷人的实施near 客户端的排序规则正确排序我需要一个 JavaScript 函数来实现高效的字符串中的单个字符替换 这就是我的意思 请注意 这适用于德语文本 其他语言的排序不同 native sorting gets it wro
  • Jstree:dblclick 绑定参数数据未定义

    我尝试使用好的库jstree但我有一些奇怪的问题dblclick捆绑 这是我的代码 basic html jstree themes url http mywork shinframework shinfw themes redmond c
  • 嵌套 INotifyPropertyChanged 类不起作用

    得到了一些代码 得到了意想不到的结果 如果我用 Myclass 替换嵌套类 那就没有问题了 我想念什么 我是否绑定文本 到其他控件 或绑定图像并不重要 xaml代码
  • Android:是否可以在屏幕上同时创建底部和顶部选项卡?

    我想知道是否可以在顶部和底部设置不同的选项卡 单击时会导致不同的活动 谷歌搜索但没有找到任何相关内容 Thanks Android 的好处是几乎所有你想做的事情都可以实现 如果我们要更改您的 XML 我们会将其更改为以下内容
  • 用于淡入和淡出视图的 Angular 4 动画

    我只是希望视图在路线更改时淡入和淡出 我似乎已经正确设置了组件 但我认为需要使动画语法正确 这是我目前的动画尝试 我将此动画导入到我的组件中 import trigger state animate style transition fro
  • 使用 PHP API 进行 FB.login

    我已经设置了一个 Canvas 页面 单击表单提交按钮即可实现 FB login 在以下请求期间 它尝试通过 facebook gt api me 来自 Github 的最新 API 版本 访问用户数据 它可以在 Firefox 和 Chr
  • 检测序列参数的正确方法?

    我想编写一个接受参数的函数 该参数可以是序列或单个值 value的类型有str int等 但是我don t希望将其限制为硬编码列表 换句话说 我想知道参数 X 是一个序列还是我必须转换为序列以避免以后出现特殊情况的东西 我可以 type X
  • 错误:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“int”[-Wformat=]

    我目前正在尝试做自己的 shell 它必须是多语言的 所以我尝试实现一个读取 txt 文件中的行的函数 include
  • 如何在反应材料表上添加精美的滚动条?

    我在用着反应材料表并想要一个像样的滚动条而不是默认的分页 我努力了反应自定义滚动但它没有按照我的意图工作 我的应用程序的默认滚动条已激活 还有一件事 我怎样才能将这种类型的滚动应用到桌体上 import CustomScroll from
  • Fragment 和 Anko toast 的“接收器类型不匹配”

    我正在尝试使用 Jetbrains 的 Anko 库在我的应用程序中轻松显示 Android toast 消息 这是相关的代码片段 val message CharSequence Recycled holder taskEditText
  • 从 IntentService 向 Activity 发送消息

    我在同一个应用程序中有一个活动和一个intentService 该服务必须在活动结束后继续运行 因此我不想绑定 我已经在谷歌上搜索了几个小时 但找不到一个关于如何做到这一点的好例子 我可以启动该服务并向其传递额外内容 但现在该服务必须使用
  • iPad 上的 iAd:横向 iAd 方向不正确

    这仍然是一个相对较新的主题 因此不确定有多少人必须在 iPad iOS4 2 1 上实现 iAd 但基本上 我让 iAd 横幅以横向模式显示 并且显示正确 唯一的问题是 当我单击 测试广告 时 它会以纵向模式显示测试广告 即 设备仍处于横向
  • 有没有办法使用 Video.js 从视频标签获取当前字幕的文本?

    我想在播放视频期间获取当前字幕的文本 并且实现自己的字幕块 即隐藏原始字幕 并以几种不同的方式使用该信息 目前我使用videojs为我的球员 有什么方法可以从中获取当前标题的字符串吗 此代码获取当前提示并放入 span element fu
  • R curl::has_internet() FALSE 即使有互联网连接

    使用 R 包 Eurostat 从 EuroSTAT 下载数据时出现了问题 Population data by NUTS3 pop data lt subset eurostat get eurostat demo r pjangrp3
  • 为什么Android C2DM推送消息总是不到达?

    我已经构建了一个功能正常的 C2DM 应用程序 通常它运行得很好 并且推送消息到达得很快 然而 我发现当我第一次启动应用程序或将其重新聚焦时 消息经常不会到达 它们肯定发送成功 我收到 200 响应 并且消息格式肯定是正确的 稍后发送相同的
  • C 中的 size_t 是什么?

    我很困惑size t在 C 中 我知道它是由sizeof操作员 但它到底是什么 它是一种数据类型吗 假设我有一个for loop for i 0 i lt some size i 我应该使用int i or size t i 来自维基百科
  • 如何让自动对焦在第二个 AVCaptureSession 中工作而不重新创建会话?

    当我创建第二个 AVCaptureSession 时 自动对焦不适用于第一个 AVCaptureSession 要创建的第二个会话是自动对焦工作的会话 而第一个创建的会话则不自动对焦 我希望任一会话在另一个会话停止后启动时都能够自动对焦 就