iPhone应用程序在后台中断音频录制时

电脑杂谈  发布时间:2020-06-06 06:10:41  来源:网络整理

iphone照相hdr怎么关闭_iphone照相软件推荐_iphone录音软件照相不中断

我的iPad声音应用程序(iOS 7.1)可以在后台录制. 只要在后台录制不中断,一切都可以. 例如,如果某人有(愚蠢的?)想法在录音时开始听音乐.

我试图以不同的方式来管理这种中断,但没有成功. 问题是

  - (void)audioRecorderEndInterruption:(AVAudioPlayer *)p withOptions:(NSUInteger)flags

当应用程序在后台发生中断时,不会触发

. 然后,我尝试在另一种解决方案中,将AVAudioSessionInterruptionNotification和handleInterruption: 方法实现为

- (void) viewDidAppear:(BOOL)animated
{
......
AVAudioSession *session=[AVAudioSession sharedInstance];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handleInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:session];
.......
}
// interruption handling
- (void)handleInterruption:(NSNotification *)notification
{
    try {
        UInt8 theInterruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue];
        NSLog(@"Session interrupted > --- %s ---\n", theInterruptionType == AVAudioSessionInterruptionTypeBegan ? "Begin Interruption" : "End Interruption");
        .... MANAGE interruption begin    
        interruptionBeganWhileInBackgroundMode = TRUE;
        }            
        if (theInterruptionType == AVAudioSessionInterruptionTypeEnded) {
        .... MANAGE interruption end
        }
    } catch (CAXException e) {
        char buf[256];
        fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
    }
}

在这种情况下,在中断开始时会触发handleInterruption: ,但在中断结束时不会触发(应在InterruptionType设置为AVAudioSessionInterruptionTypeEnded的情况下触发)

为避免此问题,我决定在中断开始时设置一个标志(interruptionBeganWhileInBackgroundMode),以使应用程序获知在到达前台时发生了中断. 这样我就可以管理中断的结束了.

这似乎很聪明,但事实并非如此!这就是为什么...

iphone照相软件推荐_iphone照相hdr怎么关闭_iphone录音软件照相不中断

我尝试了两种实现方式.

解决方案1.在中断开始时将[记录器暂停]放入handleInterruption: 中,并在设置了中断标志时在comeingForeground: 方法中管理[记录器记录]. 在这种情况下,当应用程序返回到前台时,录制会立即继续进行,但不是恢复,而是由录制器擦除文件并重新开始新的录制,因此中断之前录制的所有内容都会丢失.

解决方案2.在handleInterruption中放置一个[记录器停止]: 当中断开始时,要保存文件,以确保保留记录的数据. 该记录已保存,但是当应用程序进入前台时,它将停顿约十秒钟,然后用户才能再次进行交互,就好像有一个使UI冻结的进程(保存文件?)一样.

最后一点: 在此应用程序的iPhone版本中,我有完全相同的问题: 当应用程序为前台且发生电话时,一切正常. 但是,当我的应用程序处于后台时发生电话呼叫时,我会看到与iPad版本相同的不良行为.

我注意到,iOS 7中的Apple语音备忘录应用程序可以正确管理这些背景中断(停止并保存录音),尽管它在进入前景时显示00:00:00文件长度. iTalk应用程序可以完美地管理它,当到达前台时会自动恢复记录.

有人为后台录制应用程序的音频中断管理找到解决方法吗?我在许多开发人员网站中找到了很在寻找它,但是没有答案……谢谢!

解决方案

我自己一直在经历同样的问题. 似乎iOS7 AVAudioRecorder中存在一个如何处理中断的错误. 它不会关闭文件iphone录音软件照相不中断,而是像我认为文档所述那样暂停了文件. 我还无法弄清是什么原因使应用程序重新回到前台. 就我而言,我会在10秒后看到AVAudioRecorder完成(将成功标志设置为NO).

我最终使用Audio Queues重写了录音机. 我在这里(git@github.com: vecter / Audio-Queue-Services-Example.git)找到了一些示例代码,这些示例代码有助于在Objective-C环境中进行设置,Apple SpeakHere演示中有一些代码可以处理中断通知

iphone照相hdr怎么关闭_iphone录音软件照相不中断_iphone照相软件推荐

从本质上讲,我在中断开始时停止记录,并为用户打开一个警报以保存文件. 如果在应用程序处于后台运行时开始中断,则此警报将推迟到通过UIApplicationDidBecomeActiveNotification为止.

要注意的另一件事是,音频队列中似乎有一个小错误,有时AudioQueueStart方法将返回-50. 如果您添加

AudioSessionInitialize(NULL, NULL,nil,(__bridge  void *)(self));
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                        sizeof(sessionCategory),
                        &sessionCategory
                        );
AudioSessionSetActive(true);

在使用任何AudioQueue方法之前,错误都会消失. 这些方法被标记为已弃用,但似乎是必需的.

我的iPad应用程序(iOS版本7.1)的声音可以同时在后台录制. 一切正常,只记录下来,而不在后台中断. 例如,如果某人有一个(愚蠢的?)主意,请在听音乐的同时开始录制一些东西.

我试图以不同的方式来管理这种中断,但没有成功. 问题在于

   - (无效)audioRecorderEndInterruption:(AVAudioPlayer *)p withOptions:(NSUInteger)标志

当应用程序在后台中断时

永远不会被解雇. 然后,我尝试在另一个解决方案中实现AVAudioSessionInterruptionNotification和handleInterruption: 方法

iphone照相软件推荐_iphone录音软件照相不中断_iphone照相hdr怎么关闭

   - (无效)viewDidAppear:(BOOL)
{
......
AVAudioSession *会话= [AVAudioSession sharedInstance];
[NSNotificationCenter defaultCenter]的addObserver:自我
                                         选择:@选择(handleInterruption :)
                                             名称:AVAudioSessionInterruptionNotification
                                           对象:会议];
.......
}
//中断处理 - (无效)handleInterruption:(NSNotification *)的通知
{
    尝试{
        UINT8 theInterruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey]的intValue];
        的NSLog(@会话中断,> ---%S --- \\ n,theInterruptionType == AVAudioSessionInterruptionTypeBegan开始中断:结束中断);        .... MANAGE开始中断
        interruptionBeganWhileInBackgroundMode = TRUE;        }
        如果(theInterruptionType == AVAudioSessionInterruptionTypeEnded){        .... MANAGE中断结束        }
    }赶上(CAXException E){
        焦炭BUF [256];
        fprintf中(标准错误,错误:%s(%S)\\ n,e.mOperation,e.FormatError(BUF));
    }
}

在这种情况下,handleInterruption: 当中断开始时,但不是在中断结束时(触发并设置为AVAudioSessionInterruptionTypeEnded的InterruptionType被触发),

为避免此问题,我决定在中断开始被应用程序通知时设置一个标记(interruptionBeganWhileInBackgroundMode),并且在将来出现问题时发生中断. 因此,我可以管理中断的结束.

这看起来很聪明,但事实并非如此!为什么这样...

我尝试了两种实现方法.

解决方案1即可. 在中断开始时将[记录暂停]放入handleInterruption: 在中断标志被设置时,在comeingForeground中管理[记录记录].

在这种情况下,在进行录制时立即应用潜在客户,但不要恢复,而是录制已删除的文件并重新开始新的录制,以使先前的录制中断并丢失所有内容

解决方案2.放置handleInterruption [记录停止]: 中断开始时iphone录音软件照相不中断,要保存文件,必须保留记录的数据. 该记录已保存,但是当应用程序进入前台时,它将停顿约10秒钟,然后用户可以再次进行交互,就像有一个进程(保存文件?)保持冻结的UI一样.

最后一点: 在此应用程序的iPhone版本中,我有完全相同的问题: 当该应用程序可以使用手机时,一切正常. 但是,当在后台调用我的应用程序时,我在iPad版本中看到同样的不良行为.

iphone照相软件推荐_iphone照相hdr怎么关闭_iphone录音软件照相不中断

我注意到,尽管有可能,苹果的语音备忘录在iOS7应用中正确处理了这些背景中断(停止并保存录音),显示的文件长度为00:00:00. iTalk应用程序可以完美地管理它,并在将来有希望时自动恢复录制.

有人找到音频中断管理后台运行记录应用程序的解决方案吗?我在许多开发人员的网站上发现了很在寻找它,但是没有答案...谢谢!

解决方案

我通过了同样的问题. 看来,如果iOS7中的AVAudioRecorder与中断有关,没有任何错误. 不要挂起,而是关闭文件,因为我认为该文件应该挂起. 当应用程序回到前台时,我还无法弄清楚什么是拖延的. 就我而言,我将在10秒后看到AVAudioRecorder完成(设置为NO成功信号).

我最终使用音频队列重写了录音机. 我在这里找到了一些示例代码(git@github.com: vecter / audio queue service-Example.git),以及一个Objective-C环境和Apple SpeakHere演示设置,它有助于一些代码来处理中断通知.

基本上,我在中断的录制开始时停了下来,并为用户打开警报以保存文件. 如果启动了中断并且应用程序处于后台,则警报将延迟到UIApplicationDidBecomeActiveNotification传递为止.

要注意的另一件事是,当音频队列的AudioQueueStart方法返回-50时,似乎有一个小错误. 如果您添加

  AudioSessionInitialize(NULL,NULL,零,(__桥无效*)(个体经营));
UInt32的sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                        的sizeof(sessionCategory)
                        &安培; sessionCategory
                        );
AudioSessionSetActive(真);

在使用任何AudioQueue方法之前,该错误消失了. 这些方法被标记为pcated de $ P $,但这似乎是必要的.

本文地址: IT之家»当录制音频的iPhone应用程序在后台中断时


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-235647-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...