使用 avcapturesession 切换相机

2024-03-07

在这里使用本教程:http://www.musicalgeometry.com/?p=1297 http://www.musicalgeometry.com/?p=1297我创建了一个自定义叠加层和图像捕获AVCaptureSession.

我试图允许用户在前置摄像头和后置摄像头之间切换。这是我的代码CaptureSessionManager切换相机:

- (void)addVideoInputFrontCamera:(BOOL)front {
    NSArray *devices = [AVCaptureDevice devices];
    AVCaptureDevice *frontCamera;
    AVCaptureDevice *backCamera;

    for (AVCaptureDevice *device in devices) {

        //NSLog(@"Device name: %@", [device localizedName]);

        if ([device hasMediaType:AVMediaTypeVideo]) {

            if ([device position] == AVCaptureDevicePositionBack) {
                //NSLog(@"Device position : back");
                backCamera = device;
            }
            else {
                //NSLog(@"Device position : front");
                frontCamera = device;
            }
        }
    }

    NSError *error = nil;

    if (front) {
        AVCaptureDeviceInput *frontFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:&error];
        if (!error) {
            if ([[self captureSession] canAddInput:frontFacingCameraDeviceInput]) {
                [[self captureSession] addInput:frontFacingCameraDeviceInput];
            } else {
                NSLog(@"Couldn't add front facing video input");
            }
        }
    } else {
        AVCaptureDeviceInput *backFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];
        if (!error) {
            if ([[self captureSession] canAddInput:backFacingCameraDeviceInput]) {
                [[self captureSession] addInput:backFacingCameraDeviceInput];
            } else {
                NSLog(@"Couldn't add back facing video input");
            }
        }
    }
}

现在,在我的自定义覆盖控制器中,我初始化了所有内容,如下所示viewDidLoad:

[self setCaptureManager:[[CaptureSessionManager alloc] init]];

[[self captureManager] addVideoInputFrontCamera:NO]; // set to YES for Front Camera, No for Back camera

[[self captureManager] addStillImageOutput];

[[self captureManager] addVideoPreviewLayer];
CGRect layerRect = [[[self view] layer] bounds];
[[[self captureManager] previewLayer] setBounds:layerRect];
[[[self captureManager] previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),CGRectGetMidY(layerRect))];
[[[self view] layer] addSublayer:[[self captureManager] previewLayer]];

[[_captureManager captureSession] startRunning];

切换相机按钮连接到一个名为switchCamera。我已经尝试过这个:

- (void)switchCameraView:(id)sender {

    [[self captureManager] addVideoInputFrontCamera:YES]; // set to YES for Front Camera, No for Back camera

}

当调用这个时,我收到错误NSLog来自CaptureSessionManager我不明白为什么。在viewDidLoad,如果我设置fontCamera to YES,显示前置摄像头但无法切换到后置摄像头,反之亦然。

关于如何让它正确切换有什么想法吗?


首先需要从 AVCaptureSession 中删除现有的 AVCameraInput,然后将新的 AVCameraInput 添加到 AVCaptureSession。以下对我有用(在 ARC 下):

-(IBAction)switchCameraTapped:(id)sender
{
    //Change camera source
    if(_captureSession)
    {
        //Indicate that some changes will be made to the session
        [_captureSession beginConfiguration];

        //Remove existing input
        AVCaptureInput* currentCameraInput = [_captureSession.inputs objectAtIndex:0];
        [_captureSession removeInput:currentCameraInput];

        //Get new input
        AVCaptureDevice *newCamera = nil;
        if(((AVCaptureDeviceInput*)currentCameraInput).device.position == AVCaptureDevicePositionBack)
        {
            newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];
        }
        else
        {
            newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];
        }

        //Add input to session
        NSError *err = nil;
        AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err];
        if(!newVideoInput || err)
        {
            NSLog(@"Error creating capture device input: %@", err.localizedDescription);
        }
        else
        {
            [_captureSession addInput:newVideoInput];
        }

        //Commit all the configuration changes at once
        [_captureSession commitConfiguration];
    }
}

// Find a camera with the specified AVCaptureDevicePosition, returning nil if one is not found
- (AVCaptureDevice *) cameraWithPosition:(AVCaptureDevicePosition) position
{
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices) 
    {
        if ([device position] == position) return device;
    }
    return nil;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 avcapturesession 切换相机 的相关文章

  • 我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

    在我的项目中 我将所有私有 swift 2 3 文件迁移到 swift 3 我想使用用 swift 2 3 编写的遗留框架 直到它们有 swift 3 版本 我尝试添加 使用旧版 Swift 版本 是 清除 构建我的项目 但我仍然遇到一些麻
  • 如何跟踪 SwiftUI 应用程序中的所有触摸

    我正在尝试在 SwiftUI 应用程序中实现锁屏 我需要跟踪每个事件才能重新启动锁定计时器 在 UIKit 应用程序中 我使用了这种方法 重写 UIApplication 它允许了解应用程序中的任何事件 override func send
  • 渐变方向从左到右

    我完全被这个问题难住了 它应该如此简单 以至于让我发疯 我正在使用这个苹果反射教程 苹果反射示例 http developer apple com library ios samplecode Reflection Listings MyV
  • iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放

    我正在将图像制作成视频 但总是因为内存警告而崩溃 分配太多CVPixelBufferCreate 我不知道如何正确处理 我看过很多类似的主题 但没有一个能解决我的问题 这是我的代码 void writeImagesArray NSArray
  • 有没有办法从 Instruments (Xcode) 的命令行实例中删除授权提示?

    我目前正在通过 bash 脚本使用 Instruments 来启动命令行界面以启动自动化插件的运行 在 4 2 中 这工作得很好 但是随着升级到 Xcode 4 3 我现在被提示需要授权用户 分析其他进程 即使授予了正确的凭据 也不会真正对
  • 定位精度定义 - iOS

    iOS 上返回的 准确性 或 不确定性 的统计意图是什么 即使是近似值 例如 Android 文档对其返回的精度数字进行了解释 从这个意义上讲 它大约是一个标准差 我们将准确度定义为 68 置信度的半径 换句话说 如果 您以该位置的纬度和经
  • NSIndexpath.item 与 NSIndexpath.row

    有谁知道之间的区别NSIndexpath row and NSIndexpath item 具体来说 我在以下情况中使用哪一个 UITableViewCell tableView UITableView tableView cellForR
  • 从 iOS 设备向 Google App Engine 进行身份验证

    我正在开发一个 iPhone 应用程序 它使用 Google 应用程序引擎来托管后端 我需要通过 Google 进行身份验证 但我似乎无法找到从我的应用程序中执行此操作的方法 看来我要做一个UIWebView让用户登录到我从 Google
  • 如何在 iOS 上更改设备音量 - 而不是音乐音量

    我想更改 iOS iPhone 上的设备音量 我知道我可以使用以下几行更改音乐库的音量 implement at first MediaPlayer framework MPMusicPlayerController musicPlayer
  • 是否可以对 UILabel 的文本颜色变化进行动画处理? [复制]

    这个问题在这里已经有答案了 UIView animateWithDuration 5 animations myLabel textColor UIColor redColor 标签文本颜色立即改变 Try this UIView tran
  • 在两个可移动 uiview 之间画线

    我有一个带有节点的 滚动视图 UIViews 可以拖动 我正在尝试在选定的之间绘制边缘UIViews使用 calayer 但我不知道当视图位置发生变化时如何重新绘制线条 In my viewControllerI 类在节点数组中添加第一个和
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 旋转 GPUImageTiltShiftFilter - GPUImage

    我想要一个非水平 GPUImageTiltShiftFilter 旋转 我想将其旋转到任意旋转角度 我还希望过滤器速度快 可以通过带有 UIRotationGestureRecongizer 的 UI 进行旋转 我该怎么做呢 啊 想通了 不
  • 如何在 iOS 6 中强制 UIViewController 为纵向

    As the ShouldAutorotateToInterfaceOrientation在 iOS 6 中已弃用 我用它来强制特定视图仅肖像 在 iOS 6 中执行此操作的正确方法是什么 这仅适用于我的应用程序的一个区域 所有其他视图都可
  • dyld:无法加载插入的库,但可以在模拟器和另一部 iPhone 上使用

    所以我在过去的几个小时里在我的应用程序上编码 在某个时候我决定在我的 iPhone 8 13 3 1 上启动我的应用程序而不是使用模拟器 13 3 它立即崩溃并出现以下错误 dyld warning could not load inser
  • 如何将NSTextView的格式化内容转换为字符串

    我需要将 NSTextView 的内容从 Mac 应用程序传输到 iOS 应用程序 我使用 XML 作为传输文件格式 所以我需要将 NSTextView 的内容 文本 字体 颜色等 保存为字符串 有什么办法可以做到这一点吗 一种方法是存档
  • AGVTool new-version 和 What-version 不对应

    当我做 agvtool new version all 99 它更新我的 Info plist 文件 但是 如果我这样做 agvtool what version or agvtool next version 我收到此错误 There d
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • 游戏中心玩家显示名称在沙盒中始终为“我”

    我使用用户的游戏中心显示名称和玩家 ID 来维护他们在我的服务器上的个人资料 当我进行测试时 一切似乎都正确执行 但我的沙箱帐户的用户显示名称显示为 Me 而不是附加到我的帐户的显示名称 Billybobbo 这应该在沙盒模式下发生吗 Co

随机推荐

  • 安装具有 CRAN 镜像依赖项的本地 R 包

    我已经构建了一个 R 包 即我有 mypackage tar gz 文件 该软件包依赖于其他几个软件包 所有这些软件包都可以从任何 CRAN 镜像下载和安装 现在我想在尚未安装依赖项的系统上安装此软件包 并且我希望在安装软件包时自动下载并安
  • 项目错误:QT 中的未知模块:webkitwidgets [重复]

    这个问题在这里已经有答案了 我正在尝试使用 MXE 在来自本教程 https stackoverflow com questions 14170590 building qt 5 on linux for windows 14170591
  • 使用 dplyr 和 rle 对条件组中的连续值进行计数

    我的问题与下面提出的问题非常相似 但是我想添加一个附加命令以仅返回序列具有超过 2 个连续值的情况 当给定的序列运行在给定的时代和给定的年份内有超过 2 个连续的数字时 如何计算连续 成功 的数量 即 consec 中的 1 个 类似的问题
  • SQL Server 和 MySQL 同步

    我正在与一个在 SQL Server 和 MySQL 之间同步的客户合作 其中包含完全相同的架构和数据 我们希望将这些数据集中到一个数据库中 除了性能和可维护性问题之外 最初的设计还有什么不好的地方呢 您可以使用 MySQL 实例在 SQL
  • Pandas read_csv,读取缺失值指定为 int 的布尔值

    我正在尝试将 csv 导入到 pandas 数据框中 我有用 1 和 0 表示的布尔变量 其中缺失值用 9 标识 当我尝试将 dtype 指定为布尔值时 我会收到许多不同的错误 具体取决于我尝试的内容 示例数据 test csv var1
  • 在 PowerBI 报告中排除周末?

    我在 Power BI 中有一个 VS Team Services 项目的燃尽图 这样我们就可以报告故事点 而不是剩余的工作量 在图表中 X 轴上有日期 有没有办法从图表中过滤掉周末日期 周末没有活动 I found 这个论坛帖子 http
  • 使用 Angular JS 删除 Facebook OAuth 哈希值

    Facebook 喜欢添加 到我们提供的 OAuth 回调 URL 的末尾 虽然我们没有使用基于哈希的导航 但它看起来很烦人 我想摆脱它 location hash 导致无限循环 watch 这也会发生在 window location h
  • 如何在 JSON 响应反应本机上生成动态 UI

    这里我试图生成动态 UI 通过 API 我得到了一些 JSON 格式的响应 我必须在 UI 上绘制它 就像我没有定义任何 TextInput 一样 它应该动态生成 下面是一些示例 JSON 响应 这可能会根据不同的请求而改变 请帮助 我被困
  • 使用 JavaScript 获取 IE9 中的数据列表选项

    这段代码适用于除 Internet Explorer 9 之外的所有主要浏览器 我不明白我做错了什么 这可能是我错过的一些简单的事情 复制此代码 或使用这个jsFiddle http jsfiddle net Jordan PU9BF 在I
  • 长路径 \\?\ 解决方法在某些安装上不起作用

    我正在开发的应用程序需要处理具有很长文件 路径名的文件 这是一个 Net 4 6 应用程序 因此我实现了 4 6 2 之前的解决方法 以允许使用 语法 如概述的here https stackoverflow com questions 4
  • Neo4j Cypher 查询:顺序集合,取前 n 个元素

    我在为这种社交网络类型的应用程序编写 Cypher 查询时遇到问题 它涉及用户添加帖子 本质上是带有描述的图像 用户可以查看这些帖子 在 Cypher 中 图模型是这样的 user WROTE REVIEW gt review EVALUA
  • 如果在循环中抛出异常,则使用 try-with-resources 出现奇怪的“资源泄漏:流永远不会关闭”

    为什么 Eclipse 给出一个奇怪的 资源泄漏 zin 永远不会关闭 即使我使用以下代码 也会发出警告try with resources Path file Paths get file zip Resource leak warnin
  • 根据指定格式将字符串转换为日期时间

    我希望按照指定的格式得到日期格式的最终 结果 即YYMMDD我怎样才能从下面给出的字符串中得到这个 string s 110326 从字符串到日期 DateTime d DateTime ParseExact s yyMMdd Cultur
  • 在 C++ (Qt) 中实现内省

    我想知道是否有人可以为我澄清以下内容 我即将参加与 Qt 相关的测试 示例问题相当模糊 其中一个问题如下 Qt 在 C 中通过以下方式实现自省 A 自动将每个类定义为 QObject b 定义可以在 QObject 类中调用自身的元对象 C
  • Android 相机拍摄的照片尺寸非常小

    我正在尝试从相机捕获图像 压缩它 然后将其存储到 SD 卡 如果我使用下面的代码直接将其保存到 SD 卡 我会得到完整的图像 但如果我尝试在系统中加载图像 我会得到一个超小的图像尺寸 例如 320 x 240 而不是完整的 5 mp 图像
  • 动态创建新的 PropertyInfo 对象

    这是我的第一篇文章 尽管我在某种程度上搜索了与我的问题相关的主题 但我在找到正确的答案时遇到了很多麻烦 我的问题可能很简单 但我知道答案可能并不那么容易给出 如果有的话 话虽这么说 这就是我的情况 作为示例 我有一个 PropertyInf
  • 通过命令行构建和发布 C# .NET Web 应用程序

    我需要能够通用且单独地构建和发布 C ASP NET Web 应用程序 理想情况下 我想使用 MSBuild 来构建应用程序 如果成功 我想简单地发布该网站 最好仅包含文件副本 目前 我可以使用 MSBuild 轻松构建 Web 应用程序
  • 哈希表。怎么运行的?

    现在 我试图了解如何构建Hashtable 最有趣的是 当对象被添加到Hashtable 我在一本书上读到 第一步 已计算hashCode object 接下来 我们确定该对象在Hashtable obj hashCode Hashtabl
  • ActionScript 3 读取 JPEG 质量

    我正在为 Flash 10 开发图像上传器 有没有办法读取浏览图像的 jpeg 质量 不幸的是 它不能直接完成 品质因数未存储 直接在 JPEG 文件中 这样您 无法读取品质因数 文件 from 页数 更详细地说 使用的量化表 压缩图像存储
  • 使用 avcapturesession 切换相机

    在这里使用本教程 http www musicalgeometry com p 1297 http www musicalgeometry com p 1297我创建了一个自定义叠加层和图像捕获AVCaptureSession 我试图允许用