2012-05-03 5 views
1

다음 코드에서 마이크 내용을 파일에 저장하려고합니다. 저장된 파일이 재생되지 않고 파일이 저장 될 때마다 크기가 10 바이트로만 표시됩니다. 코드에서 내가 뭘 잘못하고 있니? 누군가 제게 올바른 코드를 보여 주면 누가 그것을 저장할 수 있을까요? 그리고 저장된 파일은 그에 따라 녹음 된 내용을 재생해야합니다.Adobe는 소리를 저장하고 저장합니다

<?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; 
     import flash.display.Sprite; 
     import flash.media.Sound; 
     import flash.utils.ByteArray; 
     import flash.external.ExternalInterface; 




     public var _file:FileReference = new FileReference(); 
     [Bindable] private var micList:Array; 
     public var mic:Microphone = Microphone.getMicrophone(); 
     protected var isRecording:Boolean = false; 

     protected function startMicRecording():void 
     { 
      //var mic:Microphone = Microphone.getMicrophone(); 
      mic.gain = 60; 
      mic.rate = 11; 
      mic.setUseEchoSuppression(true); 
      mic.setLoopBack(true); 
      mic.setSilenceLevel(5, 1000); 
      Alert.show("In recording"); 
      isRecording = true; 
      mic.addEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 

     } 

     protected function stopMicRecording():void 
     { 


      //isRecording = false; 

      try{ 
      //_file.save(SampleDataEvent.SAMPLE_DATA, "recorded.wav"); 
       _file.save(SampleDataEvent.SAMPLE_DATA , "recorded.flv"); 
      } 
      catch(e:Error) 
      { 
       Alert.show("In Stopmicrecording"+e); 
      } 

     } 

     private function gotMicData(micData:SampleDataEvent):void 
     { 

      //mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 

     } 


     protected var soundRecording:ByteArray; 
     protected var soundOutput:Sound; 
     protected function playbackData():void 
     { 



     } 

     private function playSound(soundOutput:SampleDataEvent):void 
     { 

     } 







    ]]> 
</fx:Script> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<mx:ComboBox x="150" id="comboMicList" dataProvider="{micList}" /> 
<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()"/> 

</s:Application> 
+0

거의 같은 질문을 3 번 (어쩌면 더 많이) 묻습니다. – Art

+0

@Art : 이것은 더 구체적인 질문입니다 .. 솔루션을 가지고 있기 때문에 .. – Rajeev

답변

1

당신은 ByteArraygotMicData에서 당신을 물려 다음 ByteArray 것을 저장되는 데이터를 저장해야합니다. 문자열 (10 자 길이) 인 이벤트 이름을 저장하고 있습니다.

일단 그렇게하면 파일을로드하고 샘플 데이터를 사운드에 전달해야합니다. 11KHz로 샘플링했기 때문에 사운드를 8 번 재생했지만 사운드는 44KHz (4x 쓰기)로 재생되고 사운드는 스테레오이지만 마이크는 모노 (2x)입니다.

데이터를 직접 WAV 파일로 저장할 수는 없습니다 ... 원시 데이터를 기록했습니다. 적절한 WAV 헤더를 쓰는 데 어려움을 겪고 싶다면 샘플 데이터를 전달하고 파일을 Sound 개체로 전달할 필요가 없습니다. 이것은이 질문의 범위를 벗어나는 운동입니다.

행운을 빈다.

 import mx.controls.Alert; 

     public var mic:Microphone = Microphone.getMicrophone(); 
     public var recordedData:ByteArray; 

     protected function startMicRecording():void 
     { 
      mic.gain = 60; 
      mic.rate = 11; 
      mic.setUseEchoSuppression(true); 
      mic.setLoopBack(false); 
      mic.setSilenceLevel(5, 1000); 

      recordedData = new ByteArray(); 
      mic.addEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 

     } 

     protected function stopMicRecording():void 
     { 
      mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, gotMicData); 

      try{ 
       var file:FileReference = new FileReference(); 
       file.save(recordedData, "recorded.dat"); 
      } 
      catch(e:Error) 
      { 
       Alert.show("In Stopmicrecording"+e); 
      } 

     } 

     private function gotMicData(sample:SampleDataEvent):void 
     { 
      recordedData.writeBytes(sample.data, 0, sample.data.bytesAvailable); 
     } 


     protected var playbackFile:FileReference; 
     protected var soundRecording:ByteArray; 
     protected var soundOutput:Sound; 
     protected function playbackData():void 
     { 
      playbackFile = new FileReference(); 
      playbackFile.addEventListener(Event.SELECT, playbackFileSelected); 
      playbackFile.browse(); 
     } 

     private function playbackFileSelected(event:Event):void { 
      playbackFile.addEventListener(Event.COMPLETE, playbackFileLoaded); 
      playbackFile.load(); 
     } 

     private function playbackFileLoaded(event:Event):void { 
      soundRecording = playbackFile.data; 
      soundOutput = new Sound(); 
      soundOutput.addEventListener(SampleDataEvent.SAMPLE_DATA, moreInput); 
      soundOutput.play(); 
     } 

     private function moreInput(event:SampleDataEvent):void { 
      var sample:Number; 
      for (var i:int = 0; i < 1024; i++) { 
       if (soundRecording.bytesAvailable > 0) { 
        sample = soundRecording.readFloat(); 

        // write the same byte 8 times: 
        // Upsample from 11 KHz to 44 KHz (x4) 
        // Mono to Stereo (x2) 
        for(var x:int = 0; x < 8; x++) 
         event.data.writeFloat(sample); 
       } 
      } 
     } 
+2

'mic.rate = 44'(44KHz로 샘플링)를 설정할 수 있습니다. 그런 다음 사운드를 재생할 때 데이터 만 쓸 수 있습니다 두 번 :'event.data.writeFloat (sample); event.data.writeFloat (샘플); ' –

+0

@SunilD. 동의했다. 이 경우 출력 파일은 4 배 더 커지지 만 그 시점에서 비용/이점 분석이됩니다. –

+0

하나의 질문. 포함 할 곳 .event.data.writeFloat (샘플); event.data.writeFloat (sample); .. 아주 좋은 .. 비록 – Rajeev