12

一点背景:
人们喜欢游戏。
人们使用互联网。
互联网需要游戏。
游戏使用声音。
HTML5 有<audio>.

好的,到目前为止一切顺利。

最近我发现——令我惊讶的是——IE9 实际上支持playbackRate。我迫不及待地试了一下。更令人惊讶的是,它确实奏效了。我在 Chrome 中尝试了同样的方法,虽然它有效,但当我将它设置为0.5. 我已经放弃了 Firefox,因为它不支持 MP3。

继续前进,这是我的问题:IE 和 Chrome 都在更改播放速率时应用音高校正。IE 做得很好,Chrome 做得很糟糕。不管怎样,我不想要这个,我想要改变音高的声音。有了这种能力,我可以删除 650 个我必须通过程序生成的文件才能获得备用音调,并且我的项目将有更多的自由度。哎呀,如果我真的想的话,我什至可以用 HTML5 制作一个 MOD 轨道播放器(减去效果通道)。

那么,HTML5 规范中是否有任何内容允许我关闭音高校正,并且只播放声音,就好像样本实际上被拉伸或挤压在一起一样?

4

3 回答 3

6

来自Mozilla bug tracker issue on implementation playbackRate

WebKit 通过导出一个附加(前缀)属性“preservesPitch”来解决这个问题(这里向 WhatWG 提出:http: //lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-July/021100.html

大概你可以将 preservesPitch (webkitPreservesPitch for webkit) 设置为 false 以至少在 Webkit 中关闭此功能。我不熟悉其他浏览器对此属性的支持。

于 2012-07-21T14:32:57.107 回答
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
于 2012-09-26T21:13:04.520 回答
0

不,目前 HTML5 规范中没有任何内容可以让您对音频进行如此微调。

但。

当您已经决定放弃 Firefox 来限制自己时,为什么还要关心“权力”和“项目的自由”?顺便说一句,Opera 也不支持 MP3。

当然,除非这是一个个人项目,除了你自己之外没有人会使用它,因此这是一个有争议的问题。在这种情况下,如果你想以 Chrome 为目标,你可以查看Web Audio API,它可能有你想要的东西。

于 2012-01-25T08:45:31.420 回答