我目前正在开发一个PhoneGap应用程序,该应用程序按下按钮后,应该播放8秒长的声音剪辑,同时通过iOS库VideoCore通过Cordova插件将话筒通过RTMP传输到Wowza服务器。
我的问题是(只在iOS上)当声音剪辑停止播放时,麦克风--由于某种原因--也停止录制声音。但是,流仍然处于活动状态,导致服务器端的声音剪辑由8秒的麦克风输入组成,然后完全保持沉默。
注释掉在麦克风中播放声音效果的线路没有问题,但是我们需要能够播放声音。
定义媒体变量:
_alarmSound = new Media("Audio/alarm.mp3")播放声音并启动溪流:
if(_streamAudio){
startAudioStream(_alarmId);
}
if(localStorage.getItem("alarmSound") == "true"){
_alarmSound.play();
}在我看来,当PhoneGap停止播放声音剪辑时,似乎出现了某种内部资源使用冲突,但是我不知道我能做什么来修复它。
发布于 2016-07-21 09:03:54
我在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相结合。每次它完成回放或录制时,它都会使AVAudioSession失效。因为只有一个这样的会话为您的应用程序,这实际上是关闭所有声音在您的应用程序。
有一个错误注册了这个:https://issues.apache.org/jira/browse/CB-11026
由于bug仍未修复,而且您仍然希望使用Media,解决此问题的唯一方法是下载插件代码并注释掉/删除AVAudioSession被禁用的行:
[self.avSession setActive:NO error:nil];发布于 2018-06-27 14:50:15
我发现用我的代码获得这个主题的现有答案需要付出一些努力,所以我希望这能帮助需要更明确解决方案的人。
在Cordova媒体插件的5.0.2版本中,这个问题仍然存在。如果您想使用这个插件,我找到的最简单的解决方案是分叉插件存储库,并对src/ios/CDVSound.m进行以下更改。经过几个小时的研究,我无法在不修改插件源代码的情况下找到一个可行的解决方案,也无法找到合适的替代插件。
武力会话类别
Edin的答案中提到的插件的作者解释了AVAudioSession类别关于一个类似的问题的问题。由于对CDVSound.m的更改是必要的,所以我发现下面的更改比让eworx/av-音频会话适配器插件工作更容易。
查找以下代码行:
NSString* sessionCategory = bPlayAudioWhenScreenIsLocked ? AVAudioSessionCategoryPlayback : AVAudioSessionCategorySoloAmbient;
[self.avSession setCategory:sessionCategory error:&err];代之以:
[self.avSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];防止会话失活
此外,在Edin的答案中建议的更改是必要的,以防止其他音频会话的停用,然而,并不是所有的实例都需要删除。
从函数audioRecorderDidFinishRecording()、audioPlayerDidFinishPlaying和itemDidFinishPlaying()中删除以下行和周围的条件语句
[self.avSession setActive:NO error:nil];代码的其他实例用于错误处理和资源释放,在我的经验中,不需要也不应该删除。
更新:播放音量
在应用这些更改后,我们在播放过程中遇到了音频音量低的问题(而录制是活动的)。在上述各setCategory行之后添加以下行,允许以全音量播放。这些变化是在此修补程序的来源的答案中解释的。
[self.avSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];和
[weakSelf.avSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];https://stackoverflow.com/questions/31480222
复制相似问题