繁体   English   中英

PhoneGap / Cordova iOS播放声音禁用麦克风

[英]PhoneGap/Cordova iOS playing sound disables microphone

我目前正在开发PhoneGap应用程序,按下按钮后,应该播放8秒长的声音片段,同时通过使用iOS库的Cordova插件将来自麦克风的麦克风声音传输到Wowza服务器VideoCore

我的问题是(在iOS专用)当声音片段停止播放时,麦克风 - 由于某种原因 - 也停止录制声音。 但是,流仍处于活动状态,导致服务器端的声音剪辑包含8秒的麦克风输入,然后完全静音。

注释掉播放声音的线会导致麦克风重新编码声音没有问题,但我们需要能够播放声音。

定义媒体变量:

_alarmSound = new Media("Audio/alarm.mp3")

播放声音并启动流:

if(_streamAudio){
    startAudioStream(_alarmId); 
}
if(localStorage.getItem("alarmSound") == "true"){
    _alarmSound.play();
}

在我看来,当PhoneGap停止播放声音片段时会发生某种内部资源使用冲突,但是我不知道我能做些什么来修复它。

我在iOS上遇到了同样的问题,我通过做两件事解决了这个问题:

AVAudioSession类别

在iOS中,应用程序应使用单例AVAudioSession指定对声音资源的要求。 使用Cordova时,有一个插件可以让你这样做: https//github.com/eworx/av-audio-session-adapter

例如,当您想要播放声音时,您将类别设置为播放:

audioSession.setCategoryWithOptions(
        AVAudioSessionAdapter.Categories.PLAYBACK,
        AVAudioSessionAdapter.CategoryOptions.MIX_WITH_OTHERS,
        successCallback, 
        errorCallback
    );

当您想使用麦克风录制声音并仍然能够播放声音时,您将类别设置为PLAY_AND_RECORD:

audioSession.setCategoryWithOptions(
        AVAudioSessionAdapter.Categories.PLAY_AND_RECORD,
        AVAudioSessionAdapter.CategoryOptions.MIX_WITH_OTHERS,
        successCallback, 
        errorCallback
    );

cordova-plugin-media杀死了AVAudioSession

您用于播放的Media插件处理录制和播放的方式使其无法与其他声音插件和Web Audio API结合使用。 每次完成播放或录制时,它都会停用AVAudioSession。 由于您的应用只有一个此类会话,因此可以有效地停用应用中的所有声音。

为此注册了一个错误: https//issues.apache.org/jira/browse/CB-11026

由于该错误仍未修复,并且您仍想使用Media插件,解决此问题的唯一方法是下载插件代码并注释掉/删除AVAudioSession停用的行:

[self.avSession setActive:NO error:nil];

我发现需要花费一些精力才能将这个主题的现有答案与我的代码一起使用,所以我希望这能帮助需要更明确解决方案的人。


Cordova Media插件 5.0.2版本开始,此问题仍然存在。 如果你想使用这个插件,我发现最直接的解决方案是分叉插件存储库并对src/ios/CDVSound.m进行以下更改。 经过几个小时的研究,我无法在不修改插件源的情况下找到可行的解决方案,也无法找到合适的替代插件。

强制会话类别

在Edin的回答中提到的插件的作者解释了AVAudioSession类别在类似问题上的问题 由于CDVSound.m都需要更改CDVSound.m ,我发现以下更改比使eworx / av-audio-session-adapter插件工作更容易。

找到以下代码行:

NSString* sessionCategory = bPlayAudioWhenScreenIsLocked ? AVAudioSessionCategoryPlayback : AVAudioSessionCategorySoloAmbient;
[self.avSession setCategory:sessionCategory error:&err];

替换为:

[self.avSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];

防止会话停用

此外,在Edin的回答中建议的更改对于防止其他音频会话的停用是必要的,但并非所有实例都需要删除。

从函数audioRecorderDidFinishRecording()audioPlayerDidFinishPlayingitemDidFinishPlaying()删除以下行和周围的条件语句:

[self.avSession setActive:NO error:nil];

代码的其他实例用于错误处理和资源释放,根据我的经验,不需要也不应该删除。

更新:播放音量

应用这些更改后,我们在播放期间遇到了音量较低的问题(录制处于活动状态时)。 在上面的相应setCategory行之后添加以下行允许以完整音量播放。 这些修改在解决方案中得到了解释。

[self.avSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

[weakSelf.avSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM