1

在下面的代码中,我试图将麦克风内容保存到文件中。保存的文件不播放,每次保存文件时,我看到大小只有 10 个字节。我在代码中做错了什么.谁能告诉我正确的代码来保存它。保存的文件应该相应地播放录制的内容。

<?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>
4

1 回答 1

1

您需要将交给您的数据存储gotMicData到 a中ByteArray,然后保存ByteArray。您正在保存事件名称,它是一个字符串(10 个字符长)。

完成此操作后,您需要加载文件并将样本数据传递给声音。您将声音播放 8 次......因为您以 11 KHz 采样但声音以 44 KHz(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);
                }
            }
        }
于 2012-05-03T10:45:26.620 回答