Phaser.js音频资源处理篇

概述

  1. 支持两种音频模式
    • webAudio
      • 缺点:无法对音频进行进一步的控制, 不能播放两个音轨
    • html5Audio
      • 以节点表示音频流
  2. Phaser.SoundManager对象

    var game = Phaser.Game();
    var soundManager = game.sound;
  3. Phaser.Sound对象

    var game = Phaser.Game();
    var sound = game.add.audio(key, volume?, loop?);
    //volume 表示音量大小

音频资源的加载

  1. 加载单一资源

    var game = new Phaser.Game();
    game.load.audio(key, urls, autoDecode?);
        // urls是字符串或者字符串的数组,这里字符串的数组是不同格式的优先使用
  2. 加载audiosprite资源

    • game.load.audiosprite(key, urls, jsonURL?, jsonData?, autoDecode?);
    • autosprite生成工具:https://github.com/tonistiigi/audiosprite

    • 实例

      function state(){
      
          this.init = function(){
              game.scale.pageAlignHorizontally = true; //水平居中
              game.scale.pageAlignVertically = true; //垂直居中
          }
      
          this.preload = function(){
      
              game.load.audio('sound1', 'asset/audio/1.mp3');
      
              game.load.audiosprite('audiosprite', [
                  'asset/audio/myaudiosprite.ogg',
                  'asset/audio/myaudiosprite.m4a',
                  'asset/audio/myaudiosprite.mp3',
                  'asset/audio/myaudiosprite.ac3'
              ], 'asset/audio/myaudiosprite.json');
          }
      
          this.create = function(){
              var sound = game.add.audio('sound1');
              var audiosprite = game.add.audioSprite('audiosprite');
      
          }
      
      }

使用和管理

  1. 音频播放控制
    这里写图片描述
  2. 实例

        function state(){
    
        this.init = function(){
            game.scale.pageAlignHorizontally = true; //水平居中
            game.scale.pageAlignVertically = true; //垂直居中
        }
    
        this.preload = function(){
            game.load.audio('music', 'asset/sound/1.mp3');
    
            game.load.image('btn_play', 'asset/sound/btn_play.png');
            game.load.image('btn_pause', 'asset/sound/btn_pause.png');
            game.load.image('btn_resume', 'asset/sound/btn_resume.png');
            game.load.image('btn_stop', 'asset/sound/btn_stop.png');
        }
    
        this.create = function(){
            var sound = game.add.audio('music', 0.1);
    
            var btn_play = game.add.button(260, 20, 'btn_play', function(){
                sound.play(); //播放
            });
            var btn_pause = game.add.button(260,145, 'btn_pause', function(){
                sound.pause(); //暂停
            });
            var btn_resume = game.add.button(260, 280, 'btn_resume', function(){
                sound.resume(); //恢复
            });
            var btn_stop = game.add.button(260, 415, 'btn_stop', function(){
                sound.stop(); //停止
            });
    
        }
    
    }
  3. 声音的分段标注

    //标注声音
    //sound.addMarker(name, start, duration, volume?, loop?); 
    //播放标注的声音
    //sound.play(name);
    //移除标注
    //sound.removeMarker(name);
    
        function state(){
    
        this.init = function(){
            game.scale.pageAlignHorizontally = true; //水平居中
            game.scale.pageAlignVertically = true; //垂直居中
        }
    
        this.preload = function(){
            game.load.audio('music', 'asset/sound/1.mp3');
    
            game.load.image('btn_play', 'asset/sound/btn_play.png');
        }
    
        this.create = function(){
            var sound = game.add.audio('music', 0.1);
    
            sound.addMarker('marker1', 5, 1);
    
            var btn_play = game.add.button(260, 20, 'btn_play', function(){
                sound.play('marker1'); //播放
            });
        }
    
    }
  4. 声音的淡入淡出
    这里写图片描述

            function state(){
    
            this.init = function(){
                game.scale.pageAlignHorizontally = true; //水平居中
                game.scale.pageAlignVertically = true; //垂直居中
            }
    
            this.preload = function(){
                game.load.audio('music', 'asset/sound/1.mp3');
    
                game.load.image('btn_play', 'asset/sound/btn_play.png');
                game.load.image('btn_pause', 'asset/sound/btn_pause.png');
            }
    
            this.create = function(){
                var sound = game.add.audio('music');
    
                var btn_play = game.add.button(260, 20, 'btn_play', function(){
                    sound.fadeIn(3000); //淡入
                });
                var btn_pause = game.add.button(260,145, 'btn_pause', function(){
                    sound.fadeOut(3000); //淡出
                });
            }
    
        }
    
        ```
    5. 声音事件
    ![这里写图片描述](http://img.blog.csdn.net/20160527010912535)
    
        ```
        function state(){
    
        this.init = function(){
            game.scale.pageAlignHorizontally = true; //水平居中
            game.scale.pageAlignVertically = true; //垂直居中
        }
    
        this.preload = function(){
            game.load.audio('music', 'asset/sound/1.mp3');
    
            game.load.image('btn_play', 'asset/sound/btn_play.png');
            game.load.image('btn_pause', 'asset/sound/btn_pause.png');
            game.load.image('btn_resume', 'asset/sound/btn_resume.png');
            game.load.image('btn_stop', 'asset/sound/btn_stop.png');
        }
    
        this.create = function(){
            var sound = game.add.audio('music');
            sound.onPlay.add(function(){
                alert('play');
            });
            sound.onPause.add(function(){
                alert('pause');
            });
            sound.onResume.add(function(){
                alert('resume');
            });
            sound.onStop.add(function(){
                alert('stop');
            });
    
            var btn_play = game.add.button(260, 20, 'btn_play', function(){
                sound.play(); //播放
            });
            var btn_pause = game.add.button(260,145, 'btn_pause', function(){
                sound.pause(); //暂停
            });
            var btn_resume = game.add.button(260, 280, 'btn_resume', function(){
                sound.resume(); //恢复
            });
            var btn_stop = game.add.button(260, 415, 'btn_stop', function(){
                sound.stop(); //停止
            });
        }
    
    }
Record sounds / noises around you and turn them into music. It’s a work in progress, at the moment it enables you to record live audio straight from your browser, edit it and save these sounds as a WAV file. There's also a sequencer part where you can create small loops using these sounds with a drone synth overlaid on them. See it working: http://daaain.github.com/JSSoundRecorder Technology ---------- No servers involved, only Web Audio API with binary sound Blobs passed around! ### Web Audio API #### GetUserMedia audio for live recording Experimental API to record any system audio input (including USB soundcards, musical instruments, etc). ```javascript // shim and create AudioContext window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext; var audio_context = new AudioContext(); // shim and start GetUserMedia audio stream navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; navigator.getUserMedia({audio: true}, startUserMedia, function(e) { console.log('No live audio input: ' + e); }); ``` #### Audio nodes for routing You can route audio stream around, with input nodes (microphone, synths, etc), filters (volume / gain, equaliser, low pass, etc) and outputs (speakers, binary streams, etc). ```javascript function startUserMedia(stream) { // create MediaStreamSource and GainNode var input = audio_context.createMediaStreamSource(stream); var volume = audio_context.createGain(); volume.gain.value = 0.7; // connect them and pipe output input.connect(volume); volume.connect(audio_context.destination); // connect recorder as well - see below var recorder = new Recorder(input); } ``` ### WebWorker Processing (interleaving) record buffer is done in the background to not block the main thread and the UI. Also WAV conversion for export is also quite heavy for longer recordings, so best left to run in the background. ```javascript this.context = input.context; this.node = this.context.createScriptProcessor(4096, 2, 2); this.node.onaudioprocess = function(e){ worker.postMessage({ command: 'record', buffer: [ e.inputBuffer.getChannelData(0), e.inputBuffer.getChannelData(1) ] }); } ``` ```javascript function record(inputBuffer){ var bufferL = inputBuffer[0]; var bufferR = inputBuffer[1]; var interleaved = interleave(bufferL, bufferR); recBuffers.push(interleaved); recLength += interleaved.length; } function interleave(inputL, inputR){ var length = inputL.length + inputR.length; var result = new Float32Array(length); var index = 0, inputIndex = 0; while (index < length){ result[index++] = inputL[inputIndex]; result[index++] = inputR[inputIndex]; inputIndex++; } return result; } ``` ```javascript function encodeWAV(samples){ var buffer = new ArrayBuffer(44 + samples.length * 2); var view = new DataView(buffer); /* RIFF identifier */ writeString(view, 0, 'RIFF'); /* file length */ view.setUint32(4, 32 + samples.length * 2, true); /* RIFF type */ writeString(view, 8, 'WAVE'); /* format chunk identifier */ writeString(view, 12, 'fmt '); /* format chunk length */ view.setUint32(16, 16, true); /* sample format (raw) */ view.setUint16(20, 1, true); /* channel count */ view.setUint16(22, 2, true); /* sample rate */ view.setUint32(24, sampleRate, true); /* byte rate (sample rate * block align) */ view.setUint32(28, sampleRate * 4, true); /* block align (channel count * bytes per sample) */ view.setUint16(32, 4, true); /* bits per sample */ view.setUint16(34, 16, true); /* data chunk identifier */ writeString(view, 36, 'data'); /* data chunk length */ view.setUint32(40, samples.length * 2, true); floatTo16BitPCM(view, 44, samples); return view; } ``` ### Binary Blob Instead of file drag and drop interface this binary blob is passed to editor. Note: BlobBuilder deprecated (but a lot of examples use it), you should use Blob constructor instead! ```javascript var f = new FileReader(); f. { audio_context.decodeAudioData(e.target.result, function(buffer) { $('#audioLayerControl')[0].handleAudio(buffer); }, function(e) { console.warn(e); }); }; f.readAsArrayBuffer(blob); ``` ```javascript function exportWAV(type){ var buffer = mergeBuffers(recBuffers, recLength); var dataview = encodeWAV(buffer); var audioBlob = new Blob([dataview], { type: type }); this.postMessage(audioBlob); } ``` ### Virtual File – URL.createObjectURL You can create file download link pointing to WAV blob, but also set it as the source of an Audio element. ```javascript var url = URL.createObjectURL(blob); var audioElement = document.createElement('audio'); var downloadAnchor = document.createElement('a'); audioElement.controls = true; audioElement.src = url; downloadAnchor.href = url; ``` TODO ---- * Sequencer top / status row should be radio buttons :) * Code cleanup / restructuring * Enable open / drag and drop files for editing * Visual feedback (levels) for live recording * Sequencer UI (and separation to a different module) Credits / license ----------------- Live recording code adapted from: http://www.phpied.com/files/webaudio/record.html Editor code adapted from: https://github.com/plucked/html5-audio-editor Copyright (c) 2012 Daniel Demmel MIT License
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值