【问题标题】:Adobe record sound and saveAdobe 录制声音并保存
【发布时间】:2012-05-03 08:13:18
【问题描述】:

在下面的代码中,我试图将麦克风内容保存到文件中。保存的文件不播放,每次保存文件时,我看到大小只有 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>

【问题讨论】:

  • 你第三次问几乎相同的问题(也许更多)。
  • @Art:这是更具体的问题..因为我有一个解决方案..

标签: actionscript-3 adobe flash mxml mxmlc


【解决方案1】:

您需要将gotMicData 中传递给您的数据存储到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);
                }
            }
        }

【讨论】:

  • 您也可以设置mic.rate=44(以44KHz采样),然后在回放声音时,只写入两次数据:event.data.writeFloat(sample); event.data.writeFloat(sample);
  • @SunilD。同意。在这种情况下,您的输出文件将大 4 倍,但这只是当时的成本/收益分析。
  • 一个问题..在哪里包括..event.data.writeFloat(sample); event.data.writeFloat(sample); ..非常好..虽然
  • @Brian Genisio,我没想到文件大小增加了 4 倍 :) 现在只做两次似乎不那么吸引人了 :) @Rajeev event.data.writeFloat(sample)(两次)将取代 for 循环在 Brian 的 moreInput() 方法中。
  • 为什么录制的音量很小,甚至播放的音量也很大。。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多