Search code examples
javascripthtmlaudioaudio-streamingweb-audio-api

Why does my second audio file not play using the currentTime property?


I would like my audio2 file to play when audio1.currentTime is 3 seconds, but I'm not able to make it work. I'm a newbie in javascript, what am I missing?. This is my current javascript code:

    function initAudioPlayer(){
            var audio1, audio2, ext, agent;

            ext = ".mp3";
            agent = navigator.userAgent.toLocaleLowerCase();

            if(agent.indexOf('firefox') != -1 || agent.indexOf('opera') != -1) { ext = ".ogg";}


//Audio Objects: audio1 and audio2

            audio1 = new Audio();
            audio1.src = "folder/Audio1"+ext;
            audio1.loop = false;
            audio1.play();

            audio2 = new Audio();
            audio2.src = "folder/Audio2"+ext;
            audio2.loop = false;
            audio2.play();

//Function that reproduces the second audio file at second 3 of the first audio file

    function audio2(){
            if(audio1.currentTime == 3) {audio2.play();}
        };    
    }

    window.addEventListener("load", initAudioPlayer);

Solution

  • You Must use Audio Api and fetch buffers of your files. Then you must plus each byte and copy to another new buffer. this code can help you:

    let idnex=0;
        samples.forEach(buufer => {
    
    
          if (index === 0) {
            tempBuf = buufer;
          } else {
            tempBuf = this.appendBuffer(tempBuf, buufer);
          }
          index++;
        });
    

    and by thi method you can append two buffer:

     private appendBuffer(buffer1, buffer2) {
    
    
    const numberOfChannels = Math.min(buffer1.numberOfChannels, buffer2.numberOfChannels);
    const tmp = this.audioContextService.createBuffer(Math.max(buffer1.numberOfChannels, buffer2.numberOfChannels),
      Math.max(buffer1.length, buffer2.length), buffer1.sampleRate);
    
    for (let i = 0; i < numberOfChannels; i++) {
    
      const channel = tmp.getChannelData(i);
      let finallArray = [];
      let d = [];
      const chanelTemp = buffer1.getChannelData(i);
    
    
      if (buffer2.numberOfChannels <= i) {
    
        finallArray = chanelTemp;
      } else {
        const c = buffer2.getChannelData(i);
        if (chanelTemp.length > c.length) {
    
          finallArray = chanelTemp;
          d = c;
        } else {
    
          finallArray = c;
          d = chanelTemp;
        }
    
        for (let j = 0; j < d.length; j++) {
    
          finallArray[j] += d[j] / 2;
    
    
        }
    
      }
    
    
      channel.set(finallArray, i);
    
    }
    

    you can see my demo here


    Also You Can See this Answer