在 react-js 中播放声音

IT技术 javascript audio reactjs media wav
2021-05-23 19:55:12

我尝试在 react-js 上播放声音,但无法启动。在获取 InitialState 之前,我在 reactClass 中初始化了声音变量:

var App = React.createClass({
audio: new Audio('files/audio.mp3'),
getInitialState: function () {
return {
  playSound: false,
   ........
 }
}

这是我用于启动和停止的功能:

   playSound: function() {
if(!this.state.playSound){
    this.setState({
        playSound: true,
    }, function(){
      console.log("play sound 1");
      this.audio.play();
      console.log("play sound 2");
    });
}
},

stopSound: function() {
if(this.state.playSound){
    this.setState({
        playSound: false,
    }, function(){
        console.log("stop sound 1");
        this.audio.pause();
        console.log("stop sound 2");
    });
}
},

但我得到了这个答案:

react-app.js:346 Uncaught (in promise) DOMException: The element has no supported sources.

我已经尝试过 .mp3 和 .wav 文件。但它不会开始。我究竟做错了什么?

!!!编辑:还尝试添加一个 HTML 项目:

  <audio id="beep" loop>
         <source src="files/ring.wav" type="audio/wav" />
      </audio>

并使用以下启动/停止:

  playSound: function() {
if(!this.state.playSound){
    this.setState({
        playSound: true,
    }, function(){
      console.log("play sound 1");
      var audioElement = document.getElementById('beep');
      audioElement.setAttribute("preload", "auto");
      audioElement.autobuffer = true;
      audioElement.load();
      audioElement.play();
      console.log("play sound 2");
    });
}
},

stopSound: function() {
if(this.state.playSound){
    this.setState({
        playSound: false,
    }, function(){
        console.log("stop sound 1");
        var audioElement = document.getElementById('beep');
        audioElement.pause();
        console.log("stop sound 2");
    });
}
},

然后我在启动时没有收到错误,但它没有启动。当我按下暂停时,我得到:

Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().

!!!编辑2:

我也注意到,如果我设置按钮,播放声音。如果我打开文件管理器,转到我的 index.html 并打开它,它运行良好。如果我尝试来自 webpack-server 的页面:localhost:8000/app/index.html,它将无法工作。得到相同的 DOMException。为什么是这样?

1个回答

尝试了一段时间后,我在 index.html 文件中制作了 2 个按钮,1 个用于启动声音,一个用于停止。所以我试过了,我注意到它可以在我的文件管理器中工作,但如果我在 webpack 服务器上尝试则不行。所以我检查了我的路径,而不是:“files/audio.mp3”,我把它改成了“../files/audio.mp3”。一个菜鸟错误,但当你让 Android 开发人员使用 javascript 时,就会发生这种情况:)))