我正在开发一个录音机应用程序,它工作得很好。
但是我遇到了中断的问题。来电时,
- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder
然后调用此方法并暂停录制。
如果用户拒绝来电:
- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder
然后在这里我想从中断的地方继续录制。但是当我再次调用记录方法时,记录会从一个新文件开始。
我正在开发一个录音机应用程序,它工作得很好。
但是我遇到了中断的问题。来电时,
- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder
然后调用此方法并暂停录制。
如果用户拒绝来电:
- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder
然后在这里我想从中断的地方继续录制。但是当我再次调用记录方法时,记录会从一个新文件开始。
问题已经解决了!
我已经重写了录制代码以避免这个问题。我使用了 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);
操作系统可能在中断期间停止 AVAudioRecorder。您可以将两个或多个文件作为单个录音呈现给用户,也可以使用 AudioQueue 编写代码来处理中断(以及将音频数据保存到文件中)。
我前段时间尝试过这样做,但得出的结论是无法正确完成;操作系统本身不会让你这样做。也许这在 3.1.2 中有所改变,但是当我在 3.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 和更高版本上尝试过。