[avas] AVAudioSession.mm:1074:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio se

关于最近使用讯飞语音识别时出现的问题。


因为需求,打算使用识别的实时返回结果的方式,进行类似同传的效果(一边识别一边返回结果,然后把返回结果进行翻译,并通过语音合成播放出来)的时候,出现了下面的错误:

[avas] AVAudioSession.mm:1074:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

字面意思大致是说不能同时播放与录音。

这就尴尬了,这大致是由于setActive没有设置为 true 导致的。讯飞源码不开放,所以没法在里面实时修改。

这时想到使用分类重写

-(BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError*_Nullable__autoreleasing*)outError {

return NO;

}

我认为的分类是可以覆盖super class的方法,所以新建分类 LSAudioSession,继承于 AVAudioSession。

.h

#import    //这里默认是AVFAudio/AVFAudio.h,但是这样会有 not found 的错误,既然AVFAudio/AVFAudio.h 是继承于AVFoundation,所以改成AVFoundation/AVFoundation.h

@interfaceAVAudioSession (LSAudioSession)

@end

.m

#import "AVAudioSession+LSAudioSession.h"

@implementationAVAudioSession (AddAction)

-(BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError*_Nullable__autoreleasing*)outError {

return YES; //默认是 NO,修改成 YES

}

@end

以上.

然后就是让项目跑起来!

测试 -> 完美实现。

你可能感兴趣的:([avas] AVAudioSession.mm:1074:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio se)