2012-04-20 57 views
0

保存如何从一个麦克风记录声音,并将其从下面的代码录制声音,并使用AS

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> 
<fx:Script> 
    <![CDATA[ 
     import flash.events.SampleDataEvent; 
     import flash.media.Microphone; 
     import flash.net.FileReference; 
     import mx.controls.Alert; 
     import flash.net.FileReference; 


     [Bindable] private var microphoneList:Array; 
     protected var microphone:Microphone; 
     protected var isRecording:Boolean = false; 
     protected function setupMicrophoneList():void 
     { 
      microphoneList = Microphone.names; 
     } 
     protected function setupMicrophone():void 
     {  
      microphone = Microphone.getMicrophone(comboMicList.selectedIndex); 
     } 
     protected function startMicRecording():void 
     { 
      Alert.show("In recording"); 
      isRecording = true; 
      Alert.show("In recording1"); 
      microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 
      Alert.show("In recording22"); 
     } 
     protected function stopMicRecording():void 
     { 
      isRecording = false; 
      microphone.removeEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 
     } 
     private function gotMicData(micData:SampleDataEvent):void 
     { 
      Alert.show("In mic data"); 
      // micData.data contains a ByteArray with our sample. } 
      try{ 
      var file:FileReference = new FileReference(); 
      file.save(micData.data ,"Testsound.flv"); 
      } 
      catch(e:Error) 
      { 
       Alert.show("In gotomicdataexception"+e); 
      } 
     } 

     ]]> 
</fx:Script> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<mx:ComboBox x="150" id="comboMicList" dataProvider="{microphoneList}" /> 
<mx:Button x="250" id="startmicrec" label="Start Rec" click="startMicRecording()"/> 
<mx:Button x="350" id="stopmicrec" label="Stop Rec" click="stopMicRecording()"/> 
<mx:Button x="50" id="setupmic" label="Select Mic" click="setupMicrophone()"/> 
<mx:Button x="450" id="playrecsound" label="Play sound" click="playbackData()"/> 

+0

不知道编码器保存声音ByteArray的FLV,但micRecord库(http://code.google.com/p/ micrecorder /)有wav编码器。尝试一下。 – Art 2012-04-20 13:48:17

+0

@Art:我的问题主要是关于保存文件而不是格式。如何在录制文件后保存文件。 – Rajeev 2012-04-20 14:18:56

+0

@Rajeev通常,在课程中发布相同问题的三个版本通常不被认为是好的礼仪两天。 – JeffryHouser 2012-04-20 15:26:30

回答

0

这是你更新的代码,将提供您能力保存文件中记录后保存。但无论如何,你需要编码的ByteArray到像WAV或MP3格式:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       minWidth="955" minHeight="600" 
       creationComplete="this_creationCompleteHandler(event)"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 


      [Bindable] private var microphoneList:Array; 
      protected var microphone:Microphone; 
      protected var isRecording:Boolean = false; 
      private var soundBytes:ByteArray = new ByteArray(); 
      protected function setupMicrophoneList():void 
      { 
       microphoneList = Microphone.names; 
      } 
      protected function setupMicrophone():void 
      {  
       microphone = Microphone.getMicrophone(comboMicList.selectedIndex); 
      } 
      protected function startMicRecording():void 
      { 
       trace("In recording"); 
       isRecording = true; 
       trace("In recording1"); 
       microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 
       trace("In recording22"); 
      } 
      protected function stopMicRecording():void 
      { 
       isRecording = false; 
       microphone.removeEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 
       saveMicData(); 
      } 

      private function saveMicData():void 
      { 
       trace("In mic data"); 
       // micData.data contains a ByteArray with our sample. } 
       try{ 
        var file:FileReference = new FileReference(); 

        file.save(/*You need encoded soundBytes here*/soundBytes ,"Testsound.wav"); 
       } 
       catch(e:Error) 
       { 
        trace("In gotomicdataexception"+e); 
       } 
      } 

      private function gotMicData(event:SampleDataEvent):void 
      { 
       while(event.data.bytesAvailable) 
       { 
        var sample:Number = event.data.readFloat(); 
        soundBytes.writeFloat(sample); 
       } 
      } 

      private function playbackData():void 
      { 

      } 

      protected function this_creationCompleteHandler(event:FlexEvent):void 
      { 
       setupMicrophoneList(); 
      } 



     ]]> 
    </fx:Script> 
    <s:layout> 
     <s:VerticalLayout /> 
    </s:layout> 

    <mx:ComboBox id="comboMicList" dataProvider="{microphoneList}" /> 
    <mx:Button id="setupmic" label="Select Mic" click="setupMicrophone()"/> 
    <s:HGroup> 
     <mx:Button id="startmicrec" label="Start Rec" click="startMicRecording()"/> 
     <mx:Button id="stopmicrec" label="Stop Rec" click="stopMicRecording()"/> 
     <!--<mx:Button id="playrecsound" label="Play sound" click="playbackData()"/>--> 
    </s:HGroup> 
</s:Application>