【问题标题】:Can I "transition" the volume of an <audio> element, using javascript?我可以使用javascript“转换” <audio> 元素的音量吗?
【发布时间】:2017-11-29 20:16:07
【问题描述】:

如果我希望随着时间的推移不定期地更改&lt;div&gt;opacity,我可以使用CSS animation@keyframes

.myDiv {
  animation: myAnimation 10s linear;
}

@keyframes myAnimation {

    0% {opacity: 1;}
   80% {opacity: 1;}
   81% {opacity: 0.99;}
  100% {opacity: 0;}

}

}

但是,如果我想以相同的方式随着时间的推移不规则地更改 &lt;audio class="my-audio"&gt; 元素的 volume 怎么办?

我知道我可以开始:

var myAudio = document.getElementsByClassName('my-audio')[0];
myAudio.volume = 1.0;

但是,当声音剪辑的81% 播放并均匀淡入volume0.0 时,我如何将volume 更改为0.99,当声音剪辑的100% 有玩了吗?

这种听觉转换是否有 javascript 语法,或者我是否正在寻找一些不存在的东西(目前)?

【问题讨论】:

  • 您可以使用setTimeoutsetInterval 自己实现一个。
  • 这不能用 CSS 完成,因为 volume 是一个对象属性,而不是 CSS 属性。它可以通过 JavaScript 使用 setTimeout() 来完成,你必须自己做数学来决定音量应该多高以及何时。
  • 您可以获得音频元素的currentTime 属性,并且有一个 timeupdate 事件。与duration 属性一起,您可以进行所需的数学运算,并在正确的时间开始为volume 属性设置较低的值。
  • 我会为此创建一个新的音频文件。

标签: javascript html transition html5-audio


【解决方案1】:

我保证有更好的方法来做到这一点,无论是性能还是简单。但是,如果我理解你的问题是正确的,这是我解决这个案例的尝试:

var myAudio = document.getElementsByClassName('my-audio')[0];

myAudio.onloadedmetadata = function() {
  myAudio.ontimeupdate = function() {
    fadeVolume(kFrame)
  };
};

var kFrame = {
  0: 0,
  10: .10,
  20: .20,
  30: .30,
  40: .40,
  50: .50,
  60: 0
}

function fadeVolume(settings) {
  if (settings) {
    var keys = Object.keys(settings);
    var duration = myAudio.duration;
    var currentTime = myAudio.currentTime;
    var percentage = (currentTime / duration) * 100;

    keys.forEach(key => {
      if (key <= percentage) {
        myAudio.volume = settings[key];
      }
    })
  }
}
<audio class="my-audio" controls>
  <source src="https://www.w3schools.com/tags/mov_bbb.mp4" type="audio/ogg">
</audio>

【讨论】:

  • 我喜欢你这里的方法,@Sølve - 使用 object(或 array)可以很好地控制在音频的不同阶段提高和降低音量。
【解决方案2】:

这是我的解决方案:

audio = new Audio(`example.ogg`);
for (let i = 0; i < 10; i ++) {
   setTimeout(() => {
      audio.volume = 1 - i * 0.1;
      if (i === 9) audio.pause();
   }, i * 200); // 2 sec; change this number to raise or lower the duration
}

【讨论】:

    【解决方案3】:

    这是我最后想到的:

    1. 脚本确定audio 元素的持续时间,之后它会计算音频期间需要开始淡入淡出的时间点。
    2. 一个setInterval 开始,通过反复检查currentTime 属性来监控audio 播放了多少。
    3. 在淡入淡出的起点,setInterval 开始,它反复减少 audiovolume,直到达到零。

    工作示例:

    var myAudio = document.getElementsByTagName('audio')[0];
    var myAudioVolume = 1.0;
    var myAudioDuration;
    var myAudioPlayInterval;
    var myAudioCheckInterval;
    var myAudioDuration1Percent;
    var myAudioFadeStart = 30; // The percentage of playback before the fade starts
    
    
    setTimeout(function(){
        myAudioDuration = myAudio.duration;
        myAudioDuration1Percent = (myAudio.duration / 100); 
    }, 200);
    
    
    function myAudioFadeVolume() {
    
        myAudioFader = setInterval(function(){
            myAudioVolume = myAudio.volume;
    
            myAudioVolume = myAudioVolume - (1 / myAudioFadeStart);
            console.log('myAudio volume is now ' + myAudioVolume);
            myAudio.volume = myAudioVolume;
    
            if (myAudioVolume < 0.05) {
                
                myAudio.volume = 0;
                clearInterval(myAudioFader);
            }
    
        }, (myAudioDuration1Percent * 1000));
    }
    
    function myAudioFindFadeStart() {
    
        myAudioCheckInterval = setInterval(function(){
    
            if (myAudio.currentTime > (myAudioDuration1Percent * myAudioFadeStart)) {
    
                myAudioFadeVolume();
                clearInterval(myAudioCheckInterval);
            }
        }, 10);
    }
    
    setTimeout(function(){
        myAudio.play();
        myAudioFindFadeStart();
    }, 1500);
    <audio class="my-audio">
      <source src="https://www.w3schools.com/tags/mov_bbb.mp4" type="audio/ogg">
    </audio>

    【讨论】:

    • 太棒了!伟大的工作@Rounin。很高兴你最终找到了解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多