支持使用 AVCaptureSession 后台录制视频

2023-12-03

我正在尝试在后台录制视频,但目前当应用程序进入后台时,我的代码正在前台录制视频。

-(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error

立即触发,错误如下

     error:Error Domain=AVFoundationErrorDomain Code=-11818 "Recording Stopped" UserInfo=0x176aa180 {NSLocalizedRecoverySuggestion=Stop any other actions using the recording device and try again., NSUnderlyingError=0x1766c0e0 "The operation couldn’t be completed. (OSStatus error -16133.)", NSLocalizedDescription=Recording Stopped}

我在 DemoApp-Info.plist 中设置了以下值

Required background modes->App plays audio or streams audio/video using AirPlay
Application does not run in background->NO

下面是我的代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.captureSession = [[AVCaptureSession alloc] init];
    //CONFIGURE VIDEO RECORING
    AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
    if(self.videoInput){
        [self.captureSession addInput:self.videoInput];
    }
    else{
        NSLog(@"Input Error:%@", error);
    }

    //CONFIGURE AUDIO RECORDING
    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput *captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];
    if(captureDeviceInput){
        [self.captureSession addInput:captureDeviceInput];
    }

    //CONFIGURE DISPLAY OUTPUT
    AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    previewLayer.frame = self.view.frame;
    [self.view.layer addSublayer:previewLayer];

    //CONFIGURE FILE OUTPUT
    //HANDLE EVENT IN RECORD START/STOP ACTION AND ALSO IN AVCaptureMovieFileOutput DELEGATE
    self.captureMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];

    if([self.captureSession canAddOutput:self.captureMovieFileOutput]){
        [self.captureSession addOutput:self.captureMovieFileOutput];
    }
}



- (IBAction)btnRecordClicked:(UIBarButtonItem *)sender {

    if([[sender title] isEqualToString:@"Record"]){

        NSError *error = nil;
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        [[AVAudioSession sharedInstance] setDelegate:self];
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&error];
        NSLog(@"audioSessionError:%@", error);
        [[AVAudioSession sharedInstance] setActive:YES error: nil];
        self.captureSession.usesApplicationAudioSession = YES;
        self.captureSession.automaticallyConfiguresApplicationAudioSession = YES;
        sender.title = @"Stop";
        [self.captureSession startRunning];

        //CREATE FILE
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyyMMddHHmmss"];

        NSString *outputFileName = [[kAppDocDirPath stringByAppendingPathComponent:[dateFormatter stringFromDate:[NSDate date]]] stringByAppendingPathExtension:@"mp4"];
        NSURL *outputFileURL = [[NSURL alloc] initFileURLWithPath:outputFileName];

        [self.captureMovieFileOutput startRecordingToOutputFileURL:outputFileURL recordingDelegate:self];
    }
    else{
        [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
        [[AVAudioSession sharedInstance] setDelegate:nil];
        [[AVAudioSession sharedInstance] setActive:NO error: nil];

        sender.title = @"Record";
        [self.captureSession stopRunning];
        [self.captureMovieFileOutput stopRecording];
    }
}
-(void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error
{
    BOOL isSuccess = YES;
    NSLog(@"error:%@", error);
    if(error.code != noErr)
    {
        id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey];
        if(value)
        {
            isSuccess = [value boolValue];
        }
    }

    if(isSuccess)
    {
        ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
        if([assetsLibrary videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL])
        {
            [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:outputFileURL completionBlock:^(NSURL *assetURL, NSError *error) {
                if(error){
                    NSLog(@"Error:%@", error);
                }

                //delete temporary file
                NSError *aError = nil;
                [[NSFileManager defaultManager] removeItemAtURL:outputFileURL error:&aError];
            }];

        }
        else{
            NSLog(@"could not saved to photos album.");
        }
    }

}

None

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

支持使用 AVCaptureSession 后台录制视频 的相关文章

  • 将 NSDecimalNumber 转换为 NSString

    我正在从如下所示的对象中检索密钥 po obj TypeID 3 TypeName Asset 键值的检索方式如下 NSString typeId NSString obj objectForKey TypeID typeId 不是 NSS
  • UILocalizedIndexedCollat​​ion的sectionForObject:(id)object collat​​ionStringSelector:(SEL)selector方法中selector的作用是什么

    我是 iOS 开发的初学者 正在经历this https developer apple com library ios documentation UserExperience Conceptual TableView iPhone Cr
  • CSV 解析 - Swift 4

    我正在尝试解析 CSV 但遇到一些问题 下面是我用来解析 CSV 的代码 let fileURL Bundle main url forResource test application data Sheet 1 withExtension
  • iOS App Today 扩展未上传到物理设备

    我正在为我的应用程序创建一个今日小部件http budgt ch http budgt ch因为一些用户要求快速访问关键功能 初步 扩展在 iOS 模拟器上运行良好 安装如下 1 安装最新的容器应用程序 2 安装以 今天 为容器的扩展 但是
  • 如何在 swift 4 中进行两个并发 API 调用

    预先感谢您的帮助 我有两个 API 调用 都是并发的 任何调用都可以先成功 我不想按顺序调用 在两个调用成功后 我必须停止我的活动指示器并重新加载我的 tableView 这是我的代码 但我不知道这是正确的方法 也不知道如何重新加载我的 t
  • 恢复从未付款过的用户的应用内购买

    我正在尝试在我的应用程序中测试应用程序内购买 当我与购买了应用程序内购买的测试用户恢复应用程序内购买时 一切正常 但是当我尝试与用户恢复应用内购买时didn t在我期望框架调用以下方法之前进行应用内购买 paymentQueue resto
  • 显示不带字母的数字键盘

    iOS 默认数字键盘中是否有隐藏数字下方字母的选项 对于某些电话语言 键盘显示时不带字母 抱歉 你所要求的是不可能的 这取决于键盘语言 只有用户可以更改键盘语言 我希望这能帮到您
  • 带 ModalPresentationStyle 的弹出框在 iOS 7 iPad 中不居中

    我在使用 iOS 7 时遇到了一个问题 这似乎是一个错误 或者只是我没有做正确的事情 我有 modalViewController 它在 iPad 上以 ModalPresentationStyle 的形式显示为弹出窗口 而且它不是标准尺寸
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • BUG - 在 IOS 中没有选择标签的完成按钮

    我正在使用最新的离子并有一个简单的选择标签
  • iOS 8 支持动态链接吗?

    直到 iOS7 之前 出于安全考虑 Apple 都不支持动态链接 开发人员之间的代码重用通常依赖于静态库 这些静态库是作为应用程序可执行文件的一部分构建的 在 iOS8 中引入扩展似乎稍微改变了这一点 因为扩展是单独的可执行文件 扩展及其包
  • NSHTTPCookieStorage 是否跨应用程序持续存在?

    所以我只是好奇 NSHTTPCookieStorage 是否跨应用程序持久存在 或者仅在当前应用程序本地 我希望在另一个应用程序中收集的一些 cookie 可以在搜索应用程序中访问 是这样的吗 谢谢 PS 这是在 iPhone 或 iPad
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • 部署目标是什么意思?

    这是我假设的一个非常简单的问题 有人可以告诉我部署目标是什么意思吗 如果我选择 iOS 10 是否意味着只有 iOS 10 的用户才能下载该应用程序 选择较低的部署目标是否不好 另外 继续部署目标 是否不建议在较低的部署目标上运行 假设您已
  • CLLocation Manager如何在一定距离后更新

    我正在使用 CLLocationManager didupdatelocations 如下所示 func locationManager manager CLLocationManager didUpdateLocations locati
  • 在 Android 上使用 opus 剪辑从 IOS 发送的声音

    我正在 IOS 中从 audioUnit 录制音频 用 opus 编码字节并通过 UDP 将其发送到 android 端 问题是播放的声音有点削波 我还通过将原始数据从 IOS 发送到 Android 来测试声音 效果非常完美 我的 Aud
  • 从数组中获取随机字符串[重复]

    这个问题在这里已经有答案了 我试图从数组 firstArray 中获取随机字符串并将其打印在 UILabel label 中 我似乎无法弄清楚并且出现错误 感谢您的帮助 我尝试搜索但找不到任何最新的教程 方法 import UIKit cl
  • 如何建立辅助NSSortDescriptor排序键?

    我已成功按排序键对数据进行排序lastName 但我想知道如何排序lastName 然后由firstName 这是我用来排序的代码lastName NSSortDescriptor sortDescriptor NSSortDescript
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex

随机推荐

  • 在网络浏览器中欺骗 URL

    假设我获得了某个页面的源代码 例如http example com 我现在想将此源代码写入 Web 浏览器 使用类似以下内容 myWebBrowser Navigate about blank myWebBrowser Document W
  • 发布到 beta.6 后 angularfire2 无法工作

    angularfire2 发布到 beta 6 后 我无法正确执行我的 Ionic2 应用程序 这就是问题所在 21 54 35 lint finished in 4 51 s 21 54 35 typescript uy Network
  • 带百分比的 SVG 进度圈

    我使用此处找到的代码创建进度圈 http codepen io JMChristensen pen Ablch 但我不希望它那么大 所以我将内圆和外圆的圆半径更改为 40 而不是 90 问题是在我这样做之后 显示百分比的圆停止工作 无论我在
  • 传递给函数的最佳方式是什么 - 变量还是数组/对象?

    将数据传递给函数 变量或数组 对象 的最佳实践是什么 例如 我需要大多数功能的用户信息 我应该传递包含所有信息的完整用户对象 还是只传递我需要的信息 始终是用户名 有时是 id 很少有其他用户信息 function do something
  • 将三个字符的语言代码 (ISO 639-2) 转换为两个字符的代码 (ISO 639-1)

    我正在使用文本转语音 TTS 引擎开发 Android 应用程序 TTS 组件返回可用语言列表作为列表Locale对象 但这两种方法Locale getLanguage and Locale getISO3Language每个Locale对
  • 如何在 Enter 按键时关闭键盘

    我想在按 RETURN 键时关闭键盘 我尝试过将按钮放在视图的背面 但是我怎样才能通过按 RETURN 键来做到这一点呢 BOOL textFieldShouldReturn UITextField textField textField
  • 打开文件对话框以获取 FTP 位置

    当用户浏览 ftp 位置时 我遇到打开文件对话问题 我从 openFileDialogue 获得的路径是本地路径 本地设置临时文件夹 而不是我选择的实际 ftp 路径 如何获取实际的 ftp 路径 您正在哪个版本的 Windows 上运行
  • 获取状态消息的隐私设置?

    有谁知道是否可以查询隐私设置以获取状态更新 我知道您可以将它们用于相册 但对于我的应用程序来说 能够提取不久前的随机状态消息并说 您与所有人分享了这篇文章 您今天还会这样做吗 会很有用 看看人们对在线分享的态度如何变化 我不追求任何花哨的东
  • 如何使用“cp”命令排除特定目录?

    我想复制目录中的所有文件 除了特定子目录中的某些文件 我注意到cp命令没有 exclude选项 那么 我怎样才能实现这一目标呢 rsync快速且简单 rsync av progress sourcefolder destinationfol
  • 更改 observable 但不通知 knockout.js 中的订阅者

    有没有办法忽略可观察值变化的订阅者 我想更改可观察值的值 但不使用 Knockout js 为订阅者执行它 通常这是不可能或不可取的 因为它可能会导致依赖链中的事物不同步 使用限制扩展器通常是限制依赖项接收的通知量的好方法 但是 如果您确实
  • 在完成前一个 AJAX 请求之前中止新的 AJAX 请求

    我有一个函数 可以在输入更改时运行 AJAX 调用 但是 在之前的 ajax 调用完成之前 该函数有可能会再次被触发 我的问题是 如何在开始新的 AJAX 调用之前中止之前的 AJAX 调用 不使用全局变量 参见类似问题的回答here JS
  • 为什么克隆时不执行构造函数[重复]

    这个问题在这里已经有答案了 Animal animal new Animal 101 Constructor is executed Animal clone Animal animal clone Constructor is not e
  • 将浮点数与零进行比较

    C 常见问题解答精简版 29 17 为什么我的浮点比较不起作用 推荐这个平等测试 include
  • 使用 Visual Studio 的调试器查看动态分配的空终止字符串

    有没有办法更改 Visual Studio 调试器的默认行为 以便将鼠标悬停在以 null 结尾的动态分配的字符数组 C 上时 它将显示字符串的完整内容 而不仅仅是第一个字符 我应该提到我正在使用 Visual Studio 2010 如果
  • .NET 中的 SQL 注入

    大家好 我想知道是否有人知道一些详细介绍 NET Web 应用程序 SQL 注入预防的好网站 任何资源都将得到极大的利用 谢谢 我认为 如果您在 google 上搜索一下 防止 NET 中的 sql 注入 您会发现很多好的资源 无论如何 一
  • 堆栈宽度始终与 CPU 寄存器大小相同吗?

    例如 对于8位CPU 堆栈大小预计为8位宽 而16位CPU vs 16位堆栈宽度 以及32位 64位CPU等 对于所有架构都是如此吗 CPU有数据总线和地址总线 它们可以具有相同的宽度 但通常不是 堆栈指针是指向内存的指针 因此它通常与地址
  • 消息“安全点期间合并操作”的含义

    java 应用程序使用以下标志运行 XX PrintSafepointStatistics 然后 在标准输出控制台上生成以下行 2 个虚拟机操作在安全点期间合并 有人愿意解释一下这是什么意思吗 更一般地说 是否有 Java 参考手册详细介绍
  • 将 http:// 添加到所有不带协议的链接

    我使用 VB NET 并且想添加http 指向所有尚未以 http https ftp 等开头的链接 I want to add http here a href target self Google a but not here a hr
  • 尝试理解 ASP.NET 和 HttpClient() 的“常见”异步死锁

    在遇到 常见 异步死锁并进一步了解之后异步最佳实践我尝试在 ASP NET 中模拟这个问题 试图找出为什么我们以前从未遇到过这个问题 看起来的区别在于 我们之前使用的是 http 客户端获取异步方法 但这并没有引起问题 public cla
  • 支持使用 AVCaptureSession 后台录制视频

    我正在尝试在后台录制视频 但目前当应用程序进入后台时 我的代码正在前台录制视频 void captureOutput AVCaptureFileOutput captureOutput didFinishRecordingToOutputF