前言:公司做的幼儿早教的东西,界面都是unity 3D的,iOS这边只负责给他们提供iOS端的接口,项目期间出现了这个问题让我苦苦不能解决,自己也是百般查资料,百般测试,最终得到一些成果。
问题描述:unity的界面展示需要背景音乐和语音识别的功能,我iOS写好的接入讯飞语音识别的文件嵌入到unity导出的Xcode工程中,当开始录音进行识别的时候,背景音乐和识别错误提示音都正常,当结束语音识别的时候,背景音乐就没有声音了,是一直都不会再有声音。控制台打印的信息中觉得最可疑的就是:
错误信息: [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.
然后就以这个问题为出发点在网上搜啊搜,又类似该问题的方法都试了,但是没有得到解决。
但是发现,引起上述错误信息的方法是将下面这个单例方法中的Action参数设置为NO:
[[AVAudioSession sharedInstance] setActive:<#(BOOL)#> withOptions:<#(AVAudioSessionSetActiveOptions)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>]
然后我在我的工程文件中重新写这个方法,将Action参数设置为YES,但是无济于事,也就是说,只要将Action设置为NO了,就已经出现上述错误了,再设置为YES也只是徒劳无功。
确定问题方向:其实这个问题在我自己创建Xcode工程接入讯飞语音sdk,测试讯飞语音的时候是没有问题的,也就是说这个问题是unity导出的Xcode工程中,接入讯飞语音才会出现的问题。确定讯飞语音中或者unity的音乐播放转化成iOS时,在某个地方调用了上面这个单例方法,将Action设置为NO了,所以就要讲设置为NO的地方找到并修改,但是讯飞不是开源的,unity也看不到代码,感觉又到了问题的尽头。
但是我发现setAction:这个方法是有返回值的,返回值类型是BOOL,那这个返回值是不是就是和setAction:的值一样的呢?于是抱着试一试的心理(万一成功了呢)做了一下操作:
首先:写一个AVAudioSession的分类,在这个分类的.m中重写这个类的setAction:方法,将该方法的返回值强制返回YES。
#import "AVAudioSession+AddAction.h"
@implementation AVAudioSession (AddAction)
- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError * _Nullable __autoreleasing *)outError {
return YES;
}
@end
但是发现这个分类是继承自AVFAudio的,会报错,但是我们知道这个框架是继承自AVFoundation的,于是我讲.h中的#import <AVFAudio/AVFAudio.h>换成#import <AVFoundation/AVFoundation.h>,错误就消失了。
#import <AVFoundation/AVFoundation.h>
@interface AVAudioSession (AddAction)
@end
最后就运行程序,哇哦,背景音乐竟然没有停止播放,好像是找到了问题的解决办法了。
本人也是初次接触unity交互,这个解决办法暂时还不清楚会不会引起其他的问题,应该是不适用于必须将Action设置为NO的项目,如有更好解决办法还请多赐教。
网友评论
这个解决了我的困扰..
[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.
但是出现了一个新的问题,如果我播放的是其他APP的音乐,其他APP的音乐声音变小了不能恢复。
问题最后的解决方式是把讯飞的语音合成改成了原生的AVSpeechSynthesizer。
其中提到了你的问题,有空可以看一下:https://www.jianshu.com/p/264b8cd150bd
请您帮我看一下,我是做unity的第一次接触ios,有点懵逼。
不过我还是想知道,这是讯飞修改了ios的那些部分(可能我不懂,不过想有个印象)?
这个unity接入讯飞语音识别iOS SDK的搞几天都没搞定,唉
所以能否发个demo学习,谢谢