我正在我的应用程序中录制音频,包括前景和后台.我还处理AVAudioSessionInterruptionNotification以在中断开始时停止录制并在结束时再次开始.虽然在前台它按预期工作,当应用程序在后台录制并且我接到一个呼叫时,它不会在呼叫结束后再次开始录制.我的代码如下:
- (void)p_handleAudioSessionInterruptionNotification:(NSNotification *)notification
        {
            NSUInteger interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];

            if (interruptionType == AVAudioSessionInterruptionTypeBegan) {
                if (self.isRecording && !self.interruptedWhileRecording) {

                    [self.recorder stop];

                    self.interruptedWhileRecording = YES;
                    return;
                }
            }

            if (interruptionType == AVAudioSessionInterruptionTypeEnded) {
                if (self.interruptedWhileRecording) {
                    NSError *error = nil;
                    [[AVAudioSession sharedInstance] setActive:YES error:&error];

                    NSDictionary *settings = @{
                                       AVEncoderAudioQualityKey: @(AVAudioQualityMax),AVSampleRateKey: @8000,AVFormatIDKey: @(kAudioFormatLinearPCM),AVNumberOfChannelsKey: @1,AVLinearPCMBitDepthKey: @16,AVLinearPCMIsBigEndianKey: @NO,AVLinearPCMIsFloatKey: @NO
                                       };

                    _recorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:settings error:nil];

                    [self.recorder record];

                    self.interruptedWhileRecording = NO;
                    return;
                }
            }
        }

请注意,fileURL指向NSDocumentDirectory子目录中的新caf文件.配置背景模式音频.我也试过voip和沉默,都没有成功.

AVAudioSessionInterruptionTypeEnded块中的NSError是Osstatus错误560557684,我还没有找到解决方法.

任何帮助将非常感激.

解决方法

错误560557684适用于AVAudioSessionErrorCodeCannotinterruptOthers.当您的后台应用程序尝试激活不与其他音频会话混合的音频会话时,会发生这种情况.后台应用程序无法启动不与前台应用程序的音频会话混合的音频会话,因为这会中断当前用户正在使用的应用程序的音频.

要解决此问题,请确保将会话类别设置为可混合的会话类别,例如AVAudioSessionCategoryPlayback.另外一定要设置类别选项AVAudioSessionCategoryOptionMixWithOthers(必需)和AVAudioSessionCategoryOptionDuckOthers(可选).例如:

// background audio *must* mix with other sessions (or setActive will fail)
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback
                                 withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDuckOthers
                                       error:&sessionError];
if (sessionError) {
    NSLog(@"ERROR: setCategory %@",[sessionError localizedDescription]);
}

错误代码560557684实际上是32位整数中的4个ascii字符’!int’.错误代码列在AVAudioSession.h文件中(另请参见AVAudioSession):

@enum AVAudioSession error codes
    @abstract   These are the error codes returned from the AVAudioSession API.
...
    @constant   AVAudioSessionErrorCodeCannotinterruptOthers
        The app's audio session is non-mixable and trying to go active while in the background.
        This is allowed only when the app is the NowPlaying app.

typedef NS_ENUM(NSInteger,AVAudioSessionErrorCode)
{
...
    AVAudioSessionErrorCodeCannotinterruptOthers = '!int',/* 0x21696E74,560557684 */
...

ios – AVAudioRecorder在音频会话中断结束后不在后台录制的更多相关文章

  1. 如何在Swift中断后恢复音频?

    我按照指示here,我已经把这个测试项目放在一起来处理音频播放的中断.具体来说,我正在使用默认iphone时钟应用程序中的警报作为中断.似乎中断处理程序被调用,但没有超过let=interruptionType行,因为“错误类型”出现了两次.此外,按照一个想法here,我已经修改了处理程序结果是所有“开始”,“音频暂停”,“结束”和“音频恢复”都显示在控制台中,但音频播放实际上并未恢复.注意:我将

  2. Windows中的中断处理

    我想知道哪些线程处理设备中断.当用户模式线程运行时出现中断时会发生什么?本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. ubuntu – 高LOC中断的原因是什么?

    我看到LOC中断出现了巨大的峰值–大约每秒400万,究竟是什么会导致LOC中断,这会导致这些峰值,我该怎么办呢?

  4. 如何将单个换行符作为PHP Markdown中的实线中断处理?

    我正在读http://github.github.com/github-flavored-markdown/我想在PHPMarkdown中实现“Newline修改”:最好我想到的是:但这是非常不可预知的.在您的降价文件中查找行:并将其下面的preg模式从:至:或者你可以扩展markdown类,重新声明’doHardBreaks’功能,并将返回值改为上面的代码问候,Achmad

  5. php – MySQL中“许多连续中断的连接请求”是什么?

    我经常有以下错误:PHP致命错误:带有消息’sqlSTATE[HY000]的未捕获异常’PDOException'[1129]由于许多连接错误,主机’MYSERVER’被阻止;使用’MysqLadminflush-hosts’取消阻止使用常规MysqLadminflush-hosts命令或增加max_connect_errors系统变量很容易解决问题,如here所示.但是!什么是“许多连续中断的连接请求”,为什么会发生这种情况?

  6. Windows Server 2008,一个非常小的DDoS能够杀死我的服务器

    4个所以我有运行WindowsServer2008的i73.2Ghz6核专用服务器,网速为1Gbps.一切都运行良好,机器强大到足以处理甚至高达700Mbps的DoS攻击非常容易..没有滞后,没有问题..有时候我们习惯了大攻击,但一次只有1或2个IP,所以cpu使用率总是很好,直到最近,我们发现了一个全新的DDoS攻击!当我的服务器能够在以前的网络使用率的90%之前保持活力时,他怎么能以4%的网络使用率杀死我的服务器?!

  7. windows-xp – 什么是“中断”过程以及为什么它如此喜欢我的CPU?

    我在IntelCoreDuo2GHz上安装了WindowsXPSP3.根据ProcessExplorer,“Interrupts”进程不断占用30-40%的cpu.这是正常的吗?

  8. windows – 重新安装操作系统时软件raid是否中断?

    重新安装操作系统时,软件raid会中断吗?如果是,有没有办法防止它,或重新安装后没有数据丢失重新创建它?如果不是,那么在做这件事时你有什么需要记住的吗?还是只是自动修复?

  9. 程序集 – 使用自己的键盘中断`int 09h`处理程序时代码的奇怪行为(损坏的绘制)

    替代方案.我确实检查了如何编写DOS键盘处理程序,所以这是我的建议:…然后在游戏代码中,要检查密钥的状态,你也必须使用cs:

  10. ios – AVAudioRecorder在音频会话中断结束后不在后台录制

    int’.错误代码列在AVAudioSession.h文件中:

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部