9

我正在开发一个录音机应用程序,它工作得很好。

但是我遇到了中断的问题。来电时,

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder

然后调用此方法并暂停录制。

如果用户拒绝来电:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder

然后在这里我想从中断的地方继续录制。但是当我再次调用记录方法时,记录会从一个新文件开始。

4

4 回答 4

7

问题已经解决了!

我已经重写了录制代码以避免这个问题。我使用了 AudioQueues,基本上后端代码与 SpeakHere 应用程序相同,只是做了一些小改动。在其中提供了另外两个 api:

-(void)resume
{
    AudioQueueStart(queueObject, NULL);
}

-(void)pause
{
    AudioQueuePause(queueObject);
}

在 AudioRecorder 类中。基本目的是避免在记录方法中完成的记录设置。

设置中断回调,然后在回调中适当地使用此暂停和恢复方法。还要注意根据您的应用程序是否需要设置活动音频会话。

希望这可以帮助那里的人。

编辑:

音频中断监听回调:

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState)
{
    if (interruptionState == kAudioSessionBeginInterruption) 
    {
        [self.audioRecorder pause];
    } 
    else if (interruptionState == kAudioSessionEndInterruption) 
    {
        // if the interruption was removed, and the app had been recording, resume recording
        [self.audioRecorder resume];
    }
}

监听音频中断:

AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, self);
于 2010-02-16T15:16:18.617 回答
2

操作系统可能在中断期间停止 AVAudioRecorder。您可以将两个或多个文件作为单个录音呈现给用户,也可以使用 AudioQueue 编写代码来处理中断(以及将音频数据保存到文件中)。

于 2009-12-30T23:40:48.020 回答
0

我前段时间尝试过这样做,但得出的结论是无法正确完成;操作系统本身不会让你这样做。也许这在 3.1.2 中有所改变,但是当我在 3.0 中尝试时,它就行不通了。

于 2010-01-01T03:10:38.040 回答
0

要处理中断,您必须使用 AVAudioSessionDelegate 方法而不是 AVAudioRecorderDelegate 方法。这是处理中断的代码示例:

/*=================================================================
 Interruption Handling Method during Recording
 ==================================================================*/

- (void) beginInterruption 
{
 if(self.recorder)
        {
  //Method to handle UI
 }
}

- (void) endInterruption
{

 NSError *err = noErr;
 [[AVAudioSession sharedInstance] setActive: YES error: &err];
 if(err != noErr)
 {
   NSLog([err description]);
 }
        //method to handle UI
} 

第一种方法自动停用音频会话。因此,在第二种方法中,您必须重新激活音频会话。第一种方法将暂停录制,当中断结束时您可以使用第二种方法恢复。我在 3.0 和更高版本上尝试过。

于 2010-02-15T11:40:41.133 回答