Почему мой второй аудиофайл не воспроизводится с использованием свойства currentTime? - PullRequest
0 голосов
/ 04 октября 2018

Я бы хотел, чтобы мой файл audio2 воспроизводился, когда audio1.currentTime равен 3 секундам, но я не могу заставить его работать.Я новичок в JavaScript, что мне не хватает?Это мой текущий код JavaScript:

    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);

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы должны использовать Audio Api и получить буферы ваших файлов.Затем вы должны добавить каждый байт и скопировать в другой новый буфер.этот код может вам помочь:

let idnex=0;
    samples.forEach(buufer => {


      if (index === 0) {
        tempBuf = buufer;
      } else {
        tempBuf = this.appendBuffer(tempBuf, buufer);
      }
      index++;
    });

и этим методом вы можете добавить два буфера:

 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);

}

вы можете увидеть мою демонстрацию здесь


Также Вы можете видеть этот ответ

0 голосов
/ 04 октября 2018

Если вы действительно хотите, чтобы это было точно по времени, вы не можете использовать Audio () - это элемент HTML5 , который не является точным для образца.Javascript также недостаточно точен при доставке событий, чтобы использовать обратный вызов для этого (честно говоря, ни один из них не является наиболее универсальным API для собственных ОС).Вам необходимо запланировать воспроизведение заранее, и именно здесь поступает Web Audio (https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API). Вам нужно загрузить оба семпла, декодировать их в AudioBuffers, а затем запланировать воспроизведение каждого из них с AudioBufferSourceNode.

...