我正在使用AVAudioSession
和AVAudioRecorder
在我的应用中录制音频。不幸的是,当我在录音时接听电话时,我的应用会冻结。我尝试实现AVAudioRecorder
委托方法中断,但它们没有被调用。我有一个视图控制器,用户与之交互以启动和停止录制过程,以及一个包含AVAudioRecorder
的单独录像机控制器。
我在录音机控制器中实现了以下功能:
@interface OSRecordPlayController : NSObject <AVAudioRecorderDelegate, AVAudioPlayerDelegate, AVAudioSessionDelegate>
-(void) audioRecorderBeginInterruption:(AVAudioRecorder *)recorder
{
if(recorder.recording)
{
[recorder stop];
[self stopRecording];
[self moveViewsDown];
interruptedDuringRecording = YES;
}
}
-(void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder withOptions:(NSUInteger)flags
{
if(interruptedDuringRecording)
{
[recorder prepareToRecord];
[recorder record];
interruptedDuringRecording = NO;
}
}
-(void)setUpAudioFile
{
self.recorder = [[AVAudioRecorder alloc] initWithURL:self.audioFileURL settings:audioSettings error:nil];
self.recorder.delegate = self;
self.recorder.meteringEnabled = YES;
[self.recorder prepareToRecord];
}
为什么这些不会被调用?我为两者设定了一个断点,但我没有击中它们。我已经看到这个问题相当多,没有可靠的答案,所有旧的答案都是针对AVAudioSession
委托方法的中断,但这些方法已被弃用。
答案 0 :(得分:2)
使用通知代替委托。 这是在Swift。
NSNotificationCenter.defaultCenter().addObserver(self,
selector:"sessionInterrupted:",
name:AVAudioSessionInterruptionNotification,
object:myRecorder)
答案 1 :(得分:1)
可能导致委托方法不被调用的一件事是AVAudioRecorder对象在录制完成之前被垃圾收集。如果没有其他对象保留对记录器的引用,则会发生这种情况。
当然,我自己并没有愚蠢地犯这样的错误......真的......