12

ちょっとした背景:
人々はゲームが好きです。
人々はインターネットを利用します。
インターネットにはゲームが必要です。
ゲームは音を使用します。
HTML5 には<audio>.

よし、ここまでは順調だ。

最近、驚いたことに、IE9 が実際に playbackRate をサポートしていることを発見しました。熱心にやってみました。さらに驚くべきことに、それは実際に機能しました。私はChromeで同じことを試しました0.5. Firefox は MP3 をサポートしていないので、もうやめました。

続けて、ここに私の質問があります: IE と Chrome の両方が、playbackRate を変更するときにピッチ補正を適用します。IE は素晴らしい仕事をしますが、Chrome はひどい仕事をします。いずれにせよ、私はこれを望んでいません。音のピッチを変更したいのです。この種のパワーがあれば、別のピッチにするために手続き的に生成しなければならなかった 650 個のファイルを削除でき、プロジェクトの自由度がはるかに高くなります。一体、本当にやりたければ、HTML5 で MOD トラック プレーヤーを作成することもできます (エフェクト チャネルを除く)。

では、ピッチ補正をオフにして、サンプルが文字通り引き伸ばされたかのようにサウンドを再生できるようにする HTML5 仕様はありますか?

4

3 に答える 3

6

Chromeは現在、設定可能なplaybackRateaudioParamを備えたWebAudio API( http://www.w3.org/TR/webaudio/ )をサポートしています。タグほど単純ではありません<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 に答える
6

PlaybackRate の実装に関する Mozilla バグ トラッカーの問題から

WebKit は、追加の (接頭辞付きの) 属性「preservesPitch」をエクスポートすることでこれを解決します (WhatWG に提案されているこちら: http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-July/021100.html ) 。

おそらく、preservesPitch (webkit の webkitPreservesPitch) を false に設定して、少なくとも Webkit でこの機能をオフにすることができます。このプロパティに対する他のブラウザのサポートについてはよく知りません。

于 2012-07-21T14:32:57.107 に答える
0

いいえ、現在の HTML5 仕様には、オーディオでこれほど微調整できるものはありません。

しかし。

すでに Firefox を捨てることに決めて自分自身を制限しているのに、なぜ「パワー」と「プロジェクトの自由」を気にするのでしょうか? ちなみに、Opera も MP3 をサポートしていません。

もちろん、それが自分以外の誰も使用しない個人的なプロジェクトである場合を除きます。したがって、それは論点です。その場合、たとえば Chrome をターゲットにしたい場合は、必要なものがあるかもしれないWeb Audio APIをチェックアウトできます。

于 2012-01-25T08:45:31.420 に答える