如何测试我的音频是否已经在播放?世博音频

时间:2019-09-02 10:45:40

标签: react-native expo

我在React-Native项目中使用了expo Audio,并且已经设法通过按一个按钮来播放声音(呼啦!),但是,如果我按了两次播放按钮,则声音会重复播放两次彼此顶部。

我尝试在音频开始播放后禁用该按钮,然后使用.then语句再次启用它,但是事实证明,音频开始后(而不是停止)立即调用.then语句。我以为我也可以通过检查音频是否已经在播放来做到这一点,但是我看了一下文档,似乎无法弄清楚如何访问isPlaying属性。

可在此处找到文档:https://docs.expo.io/versions/latest/sdk/audio/

我尝试了一些不同的console.logs来找到正确的信息,但是未能成功访问它。有人知道如何检查我的声音是否在播放吗?感谢所有帮助。

这是我的功能:

  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,我将得到与以前相同的问题。声音播放完毕后,我需要调用一个函数-有人知道该怎么做吗?

0 个答案:

没有答案