來介紹一下FP10.1的新功能:麥克風錄音
以前在FP10時,麥克風錄音功能需要透過FMS之類的主機, 才能錄音
現在不需要了喔,單 swf即可
再透過adobe所提供的 WAVWriter 類別, 即可把聲音資訊存成.wav格式。
1.先安裝 FlashPlayer10.1
http://labs.adobe.com/downloads/flashplayer10.html2. 準備一個麥克風(不然到這就結束了)。
3.了解一下原理:
FP10.1, Microphone類別一樣可以偵聽 SampleDataEvent.SAMPLE_DATA 事件
然後透過另一個新的ByteArray物件, 把SampleData裡的ByteArray資訊寫入。
要預聽的話,只要new一個Sound物件, 同時也偵聽SampleDataEvent
把剛剛錄好的ByteArray讀入即可
要成.wav的話
也只需透過 WAVWriter物件, 將錄好的ByteArray編碼成 WAV 格式
透過FileReference物件.save,把檔案存出來。
swf 預覽
http://milkmidi.googlepages.com/2010_02_14_MicrophoneDemo.swffla 原始檔下載
http://milkmidi.googlepages.com/2010_02_14_MicrophoneDemo.zip程式碼
/**
* @author milkmidi
* @see http://milkmidi.blogspot
* @version 1.0.1
* @date created 2010/02/12/
*/
package {
import com.adobe.audio.format.WAVWriter;
import com.bit101.components.Label;
import com.bit101.components.PushButton;
import flash.display.*;
import flash.events.*;
import flash.media.Microphone;
import flash.media.Sound;
import flash.net.FileReference;
import flash.utils.ByteArray;
import flash.utils.Timer;
import milkmidi.display.MilkmidiCopyrightClip;
import mx.binding.utils.BindingUtils;
[SWF(width = "300", height = "300", frameRate = "30", backgroundColor = "#ffffff")]
public class MicrophoneRecordExample extends Sprite {
[Bindable]
public var isRecording :Boolean = false;
private var _microphone :Microphone;
private var _label :Label;
private var _recordByte :ByteArray;
private var _timer :Timer = new Timer(1000, 20);
private var _startRecBtn :MyButton;
private var _stopRecBtn :MyButton;
private var _playRecBtn :MyButton;
private var _saveBtn :MyButton;
private var _container :Sprite = new Sprite();
public function MicrophoneRecordExample() {
new MilkmidiCopyrightClip(true, this, false).onEffectComplete = init;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
}
private function init():void {
_label = new Label(_container, 0, 0);
_microphone = Microphone.getMicrophone();
if (_microphone==null) {
_label.text = "microphone is null";
return;
}
_timer.addEventListener(TimerEvent.TIMER, function (e:TimerEvent):void {
_label.text = "second:" + _timer.currentCount;
});
_timer.addEventListener(TimerEvent.TIMER_COMPLETE, _stopRecordHandler);
_microphone.rate = 44;
createChildren();
_label.text = "microphone is ready";
BindingUtils.bindSetter( _isRecordingChange, this, "isRecording" );
}
private function _isRecordingChange(pIsRecording:Boolean):void {
_stopRecBtn.enabled = isRecording;
_startRecBtn.enabled = !isRecording;
_saveBtn.enabled = !isRecording;
_playRecBtn.enabled = !isRecording;
}
private function createChildren():void {
_container.y = 50;
addChild(_container);
_startRecBtn = new MyButton(_container, 0, 20, "START REC", _startRecHandler);
_stopRecBtn = new MyButton(_container, 0, 40, "STOP REC", _stopRecordHandler,false);
_playRecBtn = new MyButton(_container, 0, 60, "PLAY REC", _playRecordHandler,false);
_saveBtn = new MyButton(_container, 0, 80, "SAVE", _saveWavHandler,false);
}
private function _playRecordHandler(e:MouseEvent):void{
_recordByte.position = 0;
var soundOutput:Sound = new Sound();
soundOutput.addEventListener(SampleDataEvent.SAMPLE_DATA, _playSoundSampleDataHandler);
soundOutput.play();
}
private function _playSoundSampleDataHandler(e:SampleDataEvent) : void {
if (!_recordByte.bytesAvailable > 0) {
return;
}
var i:int = 0;
var _length:Number;
while (i < 8192) {
_length = 0;
if (_recordByte.bytesAvailable > 0) {
_length = _recordByte.readFloat();
}
e.data.writeFloat(_length);
e.data.writeFloat(_length);
i++;
}
}
private function _startRecHandler(e:MouseEvent):void {
isRecording = true;
_recordByte = new ByteArray();
_microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, _microphoneSampleDataHandler);
_timer.reset();
_timer.start();
}
public function _stopRecordHandler(e:Event = null) : void {
_label.text = "STOP REC";
_timer.stop();
isRecording = false;
_microphone.removeEventListener(SampleDataEvent.SAMPLE_DATA, _microphoneSampleDataHandler);
}
private function _microphoneSampleDataHandler(e:SampleDataEvent):void {
_recordByte.writeBytes(e.data);
}
private function _saveWavHandler(e:Event = null) : void {
var _file :FileReference = new FileReference();
var _wavWriter :WAVWriter = new WAVWriter();
_recordByte.position = 0;
var _resultSamples:ByteArray = new ByteArray();
_wavWriter.processSamples(_resultSamples,_recordByte, _wavWriter.samplingRate, 1);
_file.save(_resultSamples, "FP10MicphoneRecord.wav");
}
}
}
import com.bit101.components.PushButton
import flash.display.DisplayObjectContainer;
class MyButton extends PushButton {
private var _enabled:Boolean = true;
public function MyButton(pParent:DisplayObjectContainer,pX:int , pY:int , pLabel:String , pHandler:Function,pEnabled:Boolean = true):void {
super(pParent, pX, pY, pLabel, pHandler);
mouseChildren = false;
enabled = pEnabled;
}
public function get enabled():Boolean { return _enabled; }
public function set enabled(value:Boolean):void {
_enabled = value;
mouseEnabled = _enabled;
alpha = _enabled ? 1 : .4;
}
}