React native 如何测试音频是否已经播放?世博音频
我在我的React Native项目中使用expo Audio,我已经成功地在按下按钮时播放了一个声音(万岁!),但是,如果我按下两次播放按钮,声音会在彼此上方播放两次 我尝试在音频开始播放后禁用该按钮,然后使用.then语句再次启用该按钮,但结果表明,.then语句在音频开始(而不是停止)时立即被调用。我想我也可以通过检查音频是否已经播放来做到这一点,但是我看了文档,似乎不知道如何访问isPlaying属性 文档可在此处找到: 我尝试了几个不同的console.log来查找正确的信息,但未能成功访问它。有人知道如何检查我的声音是否在播放吗?非常感谢您的帮助 以下是我的功能:React native 如何测试音频是否已经播放?世博音频,react-native,expo,React Native,Expo,我在我的React Native项目中使用expo Audio,我已经成功地在按下按钮时播放了一个声音(万岁!),但是,如果我按下两次播放按钮,声音会在彼此上方播放两次 我尝试在音频开始播放后禁用该按钮,然后使用.then语句再次启用该按钮,但结果表明,.then语句在音频开始(而不是停止)时立即被调用。我想我也可以通过检查音频是否已经播放来做到这一点,但是我看了文档,似乎不知道如何访问isPlaying属性 文档可在此处找到: 我尝试了几个不同的console.log来查找正确的信息,但未能成
playSoundLocation = async (location) => {
this.setState({playing: true});
Audio.setIsEnabledAsync(true);
const soundObject = new Audio.Sound();
// console.log(Audio.isPlaying);
await soundObject.loadAsync({ uri: location })
.catch(err => { console.log(err) });
// console.log(Audio.isPlaying);
await soundObject.playAsync()
.catch(err => { console.log(err) })
.then(()=>{this.setState({playing: false})}); //calls as soon as soundstarts. Should call once ended.
console.log(Audio);
console.log(Audio.playbackStatus);
}
问题编辑
我成功地将上述功能更改为:
playSoundLocation = async (location) => {
let playingResponse = false;
if(this.state.curSoundObject !== null){
await this.state.curSoundObject.getStatusAsync().then( response=>{playingResponse = response.isPlaying})}
if(playingResponse === false){
Audio.setIsEnabledAsync(true);
const soundObject = new Audio.Sound();
await soundObject.loadAsync({ uri: location })
.catch(err => { console.log(err) });
await soundObject.playAsync()
.catch(err => { console.log(err) });
this.setState({curSoundObject: soundObject});
}
}
此功能不允许在一个声音正在播放时播放另一个声音,但是它不会禁用按钮(这对用户来说更有意义,也更美观)。如果我添加一个setState,我将得到与以前相同的问题。声音播放完毕后,我需要调用一个函数-有人知道怎么做吗?soundObject.setOnPlaybackStatusUpdate怎么样??您好,我以为这是一个用于设置显示的函数:true或false。如何查看原始值?您可以使用
setOnPlaybackStatusUpdate
更新状态变量playing
,并且在playSoundLocation
的一开始,您可以检查声音是否正在播放,并相应地进行操作(播放或不播放声音)。您可能想检查这个.state
。好的,但是一旦声音播放完毕,我如何知道,这样我就可以重新更改状态并重新启用按钮?我已经尝试添加一个事件侦听器:soundObject.addEventListener('ended',(event)=>{console.log('sound has finished');}),但是soundObject.addEventListener不是一个函数:/。soundObject.setOnPlaybackStatusUpdate怎么样?嗨,我以为这是一个用来设置isplay:true或false的函数。如何查看原始值?您可以使用setOnPlaybackStatusUpdate
更新状态变量playing
,并且在playSoundLocation
的一开始,您可以检查声音是否正在播放,并相应地进行操作(播放或不播放声音)。您可能希望检查此.state
。好的,但是一旦声音播放完毕,我如何知道,以便我可以重新更改状态并重新启用按钮?我已尝试添加一个事件侦听器:soundObject.addEventListener('ended',(event)=>{console.log('sound has finished');}),但soundObject.addEventListener不是一个函数:/。