-
Notifications
You must be signed in to change notification settings - Fork 271
audiosession
pengbin edited this page Jul 24, 2017
·
9 revisions
当每次点击预览时,金山KSYLive会设置AVAudioSession category:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
在整个采集推流过程中,KSYLive并不会调用以下接口进行active或者deactive操作。
[[AVAudioSession sharedInstance] setActive:YES error:nil];
当调用pip画中画功能时,将进入ksyplayer音频操作逻辑。
当在推流时,使用AVAudioPlayer播放音频,此时声音默认从听筒中输出。如果希望从扬声器中输出,需要对AVAudioSession做如下操作:
AVAudioSession *session = [AVAudioSession sharedInstance]; AVAudioSessionCategoryOptions opts = [session categoryOptions]; opts |= AVAudioSessionCategoryOptionDefaultToSpeaker; [session setCategory:session.category withOptions:opts error:nil];
或者在KSYAVAudioSession中设置
_bDefaultToSpeaker = YES; _bAllowBluetooth = YES;
使用第三方音乐时,会发现声音从听筒发出。
当启动推流APP后,需要在推流初始化时,bInterruptOtherAudio需要置为NO,同时监听UIApplicationDidBecomeActiveNotification通知。
当前APP切后台启动其他音乐播放APP播放音乐后,切回推流APP需要异步overrideOutputAudioPort为外置音乐播放器,才能保证第三方APP音乐声音从speaker输出,不然会从听筒输出。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becameActive) name:UIApplicationDidBecomeActiveNotification object:nil]; - (void)enableAudioToSpeaker{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; }); } - (void)becameActive{ [self enableAudioToSpeaker]; }
或者在KSYAVAudioSession中设置
_bDefaultToSpeaker = YES; _bAllowBluetooth = YES;
@property (nonatomic, assign) BOOL bInterruptOtherAudio;
说明:是否打断其他后台的音乐播放,将该属性设为NO,可以与其他后台播放共存,相互之间不会被打断;将该属性设为YES,开始采集时,会打断其他的后台播放音乐。
@property (nonatomic, assign) BOOL bDefaultToSpeaker;
说明:启动采集后,是否从扬声器播放声音,将该属性设为YES,则为默认从扬声器播放;将该属性设为NO,则为默认从听筒播放。
@property (nonatomic, assign) BOOL bAllowBluetooth;
说明:将该属性设为YES,启用蓝牙设备;将该属性设为NO,则为不启用蓝牙设备。
- (void) setAVAudioSessionOption;
说明:按照属性的设置值刷新AVAudioSession的配置,设置声音采集需要的AVAudioSession的参数。
+ (BOOL)isBluetoothInputAvaible;
- (BOOL)switchBluetoothInput:(BOOL)onOrOff;
+ (BOOL)isHeadsetInputAvaible;
+ (BOOL) isHeadsetPluggedIn;