AUDIO的播放速率和音高调节功能是什么?

12
一些背景: 人们喜欢游戏。 人们使用互联网。 互联网需要游戏。 游戏使用声音。 HTML5有 <audio>
目前一切都很好。最近我惊讶地发现 IE9 实际上支持 playbackRate。我迫不及待地试了一下,更令人惊讶的是它居然有效。我在 Chrome 中尝试了相同的操作,虽然可以使用但当我将其设为0.5时声音非常刺耳。我已经放弃使用不支持 MP3 的 Firefox。
接下来我的问题是:无论是 IE 还是 Chrome,在改变 playbackRate 时都会应用音调校正。IE 做得很好,而 Chrome 做得很糟糕。无论哪种情况,我都不想要这个,我希望声音能够改变音调。有了这样的能力,我可以删除 650 个文件,而这些文件我曾经必须以程序方式生成以获得另一个音高,并且在我的项目中将会获得更多的自由。如果我真的想要,我甚至可以在 HTML5 中制作 MOD 轨道播放器(减去 Effects 音轨)。
那么,HTML5 规范中是否有任何东西可以让我关闭音调校正,并仅仅像样本被拉伸或压缩一样播放声音?

4
好的,我会尽力满足您的要求。请提供需要翻译的内容。 - Lloyd
你有检查过HTML5音频API吗? - Lee Goddard
3个回答

6

这在FireFox中已得到支持,详见https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLMediaElement。 - mysteryegg

6
Chrome目前支持Web Audio API (http://www.w3.org/TR/webaudio/),其中有一个playbackRate audioParam可以设置。这不像<audio>标签那么简单,但允许各种酷炫的效果。我目前正在使用它来进行音高转换/时间拉伸失真的处理。
以下是一个示例:
    //build a request and fire it off
    speedChanger.loader = (function(){

      var _request       = new XMLHttpRequest(),

          _handleRequest = function(url){
            _request.open('GET',url,true);
            _request.responseType = 'arraybuffer';
            _request.onload = function(){
              SpeedChanger.audioGraph.context.decodeAudioData(_request.response, function(buffer){
                _loadedBuffer = buffer;
                SpeedChanger.audioGraph.setBuffer(buffer);
                SpeedChanger.audioGraph.setBufferCache(buffer);

              },function(){//error stuff});
            };
            _request.send();
          };

      _handleRequest("audio/file.mp3");

  }());//loader

  grainTable.audioGraph = (function(){
    var _context = new webkitAudioContext(),         //this is the container for your entire audio graph
        _source = _context.createBufferSource(),     //your buffer will sit here
        _bufferCache,                                //buffer needs to be re-initialized before every play, so we'll cache what we've loaded here

        //for chaching / retrieving the buffer
        _getBufferCache = function(){
          return _bufferCache;  
        },
        _setBufferCache = function(_sound){
          _bufferCache = _sound;
        },

        //for setting the current instance of the buffer 
        _setBuffer = function(_sound){
          _source.buffer = _sound;
        },

        _setPlaybackRate = function(rate){
          _source.playbackRate.value = rate;
        },

        _setRate = function(myRate){
            _rate = myRate;
        }

        //play it
        _playSound = function(){

          _source.noteOff(0);                       //call noteOff to stop any instance already playing before we play ours

          _source = _context.createBufferSource();  //init the source
          _setBuffer(_bufferCache);                 //re-set the buffer

          _setPlaybackRate(_rate);                  //here's your playBackRate check

          _source.connect(_context.destination);    //connect to the speakers 
          _source.noteOn(0);                        //pass in 0 to play immediately
        },

}

    return{

      context        :_context,
      setBuffer      :_setBuffer,
      setBufferCache :_setBufferCache,
      playSound      :_playSound,
      setRate        :_setRate

    }

  }());//audioGraph

你的音高转换/时间拉伸算法有什么进展吗?我只能对一个音轨进行时间拉伸,否则我就必须合并多个音轨,但这并不理想,因为我会丧失每个音轨上改变增益的能力;此外,我也无法暂停或恢复... - Thomas
很遗憾,我被工作分心了。我的最后一次尝试是使用多个delayNode来尝试重新创建多个磁带头。这似乎消除了我所经历的一些点击声。但不幸的是,目前算法还远非理想。 - joeLepper
还没有。但这看起来很有前途。谢谢你的提示。 - joeLepper
我终于让它工作了:不得不调整soundtouch;我正在预渲染所有的轨道;使用离线上下文和context.render函数。我仍然可以播放/暂停/停止/改变每个轨道的增益。 - Thomas

0

目前,HTML5规范中没有任何允许您对音频进行如此精细调整的内容。

但是。

既然您已经决定放弃Firefox,为什么还要关心“功率”和“项目自由度”呢?顺便提一下,Opera也不支持MP3。

除非这是一个个人项目,只有您自己会使用它,因此这是一个无意义的观点。如果您想针对Chrome等浏览器,请查看Web Audio API,可能会有您想要的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接