首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhoneGap/Cordova iOS播放声音禁用麦克风

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

Stack Overflow用户
提问于 2015-07-17 16:14:32
回答 2查看 792关注 0票数 1

我目前正在开发一个PhoneGap应用程序,该应用程序按下按钮后,应该播放8秒长的声音剪辑,同时通过iOS库VideoCore通过Cordova插件将话筒通过RTMP传输到Wowza服务器。

我的问题是(只在iOS上)当声音剪辑停止播放时,麦克风--由于某种原因--也停止录制声音。但是,流仍然处于活动状态,导致服务器端的声音剪辑由8秒的麦克风输入组成,然后完全保持沉默。

注释掉在麦克风中播放声音效果的线路没有问题,但是我们需要能够播放声音。

定义媒体变量:

代码语言:javascript
复制
_alarmSound = new Media("Audio/alarm.mp3")

播放声音并启动溪流:

代码语言:javascript
复制
if(_streamAudio){
    startAudioStream(_alarmId); 
}
if(localStorage.getItem("alarmSound") == "true"){
    _alarmSound.play();
}

在我看来,当PhoneGap停止播放声音剪辑时,似乎出现了某种内部资源使用冲突,但是我不知道我能做什么来修复它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-21 09:03:54

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

AVAudioSession分类

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

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

代码语言:javascript
复制
audioSession.setCategoryWithOptions(
        AVAudioSessionAdapter.Categories.PLAYBACK,
        AVAudioSessionAdapter.CategoryOptions.MIX_WITH_OTHERS,
        successCallback, 
        errorCallback
    );

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

代码语言:javascript
复制
audioSession.setCategoryWithOptions(
        AVAudioSessionAdapter.Categories.PLAY_AND_RECORD,
        AVAudioSessionAdapter.CategoryOptions.MIX_WITH_OTHERS,
        successCallback, 
        errorCallback
    );

cordova-plugin-media杀死了AVAudioSession

用于播放的Media插件处理录音和回放的方式使其无法与其他声音插件和Web相结合。每次它完成回放或录制时,它都会使AVAudioSession失效。因为只有一个这样的会话为您的应用程序,这实际上是关闭所有声音在您的应用程序。

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

由于bug仍未修复,而且您仍然希望使用Media,解决此问题的唯一方法是下载插件代码并注释掉/删除AVAudioSession被禁用的行:

代码语言:javascript
复制
[self.avSession setActive:NO error:nil];
票数 2
EN

Stack Overflow用户

发布于 2018-06-27 14:50:15

我发现用我的代码获得这个主题的现有答案需要付出一些努力,所以我希望这能帮助需要更明确解决方案的人。

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

武力会话类别

Edin的答案中提到的插件的作者解释了AVAudioSession类别关于一个类似的问题的问题。由于对CDVSound.m的更改是必要的,所以我发现下面的更改比让eworx/av-音频会话适配器插件工作更容易。

查找以下代码行:

代码语言:javascript
复制
NSString* sessionCategory = bPlayAudioWhenScreenIsLocked ? AVAudioSessionCategoryPlayback : AVAudioSessionCategorySoloAmbient;
[self.avSession setCategory:sessionCategory error:&err];

代之以:

代码语言:javascript
复制
[self.avSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];

防止会话失活

此外,在Edin的答案中建议的更改是必要的,以防止其他音频会话的停用,然而,并不是所有的实例都需要删除。

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

代码语言:javascript
复制
[self.avSession setActive:NO error:nil];

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

更新:播放音量

在应用这些更改后,我们在播放过程中遇到了音频音量低的问题(而录制是活动的)。在上述各setCategory行之后添加以下行,允许以全音量播放。这些变化是在此修补程序的来源的答案中解释的。

代码语言:javascript
复制
[self.avSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

代码语言:javascript
复制
[weakSelf.avSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31480222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档