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

Вы задаете почти тот же вопрос в третий раз (может быть, даже больше). – Art

+0

@Art: Это более конкретный вопрос .. поскольку у меня есть решение .. – Rajeev

ответ

1

Вы должны хранить данные, которые передали вам в gotMicData в ByteArray, а затем сохранить, что ByteArray. Вы сохраняете имя события, которое является строкой (длиной 10 символов).

Как только вы это сделаете, вам необходимо загрузить файл и передать образцы данных в звук. Вы воспроизводите звук 8 раз ... потому что вы пробовали на 11 кГц, но звук воспроизводится на частоте 44 кГц (запись 4 раза), а звук - стерео, но микрофон моно (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' (для выборки на частоте 44 кГц), а затем, когда вы воспроизводите звук, записывайте только данные дважды: 'event.data.writeFloat (sample); event.data.writeFloat (образец); ' –

+0

@SunilD. Согласовано. В этом случае ваш выходной файл будет в 4 раза больше, но в этот момент это просто анализ затрат/выгод. –

+0

Один вопрос..Как включить..event.data.writeFloat (sample); event.data.writeFloat (образец); .. очень приятно .. хотя – Rajeev

Смежные вопросы