当前位置: > > > Flex手机项目 - 调用麦克风录音并播放

Flex手机项目 - 调用麦克风录音并播放

在AS3的移动项目中,使用Microphone类能通过设备的麦克风来记录音频流。

下面是一个使用麦克风录音并播放的demo,效果图如下:


代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?xml version="1.0" encoding="utf-8"?>
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       title="麦克风测试"
                       creationComplete="onCreationComplete()">
 
    <fx:Script> 
        <![CDATA[
            import flash.events.SampleDataEvent;
            import flash.media.Microphone;
            import flash.media.Sound;
            import flash.utils.ByteArray;
             
            import mx.collections.ArrayCollection;
             
            private var microphone:Microphone;
            private var isRecording:Boolean = false;
            private var soundByteArray:ByteArray;
            private var soundObj:Sound;
 
            /**
             * 页面初始化
             */
            private function onCreationComplete():void
            {
                //加载麦克风列表
                soundCaptureDevices.dataProvider = new ArrayCollection(Microphone.names);
                soundCaptureDevices.selectedIndex = 0;
            }
             
            /**
             * 开始录音
             */
            private function startRecording():void
            {
                startBtn.enabled = false;
                stopBtn.enabled = true;
                playBtn.enabled = false;
                 
                soundByteArray = new ByteArray();
                 
                microphone = Microphone.getMicrophone(soundCaptureDevices.selectedIndex);
                microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
                microphone.rate = 44; //麦克风捕获声音采样速率
                microphone.gain = 100; //麦克风在传输音频信号之前需要倍增音量
                //设置应该考虑为声音的最小输入音量水平,以及静默实际开始之前的静音时间量
                microphone.setSilenceLevel(0, 1000);
            }
             
            /**
             * 停止录音
             */
            private function stopRecording():void
            {
                startBtn.enabled = true;
                stopBtn.enabled = false;
                playBtn.enabled = true;
                 
                microphone.removeEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
            }
             
            /**
             * 录音中-录音数据持续接收响应
             */
            private function onSampleData(micData:SampleDataEvent):void
            {
                //持续记录音频流
                soundByteArray.writeBytes(micData.data);
            }
             
            /**
             * 开始播放录音
             */
            private function playRecording():void
            {
                var trans:SoundTransform = new SoundTransform(1, -1);
                startBtn.enabled = false;
                soundByteArray.position = 0;
                soundObj = new Sound();
                soundObj.addEventListener(SampleDataEvent.SAMPLE_DATA, playSound);
                soundObj.play(0, 1, trans);
            }
             
            /**
             * 录音播放中
             */
            private function playSound(e:SampleDataEvent):void
            {
                if (!soundByteArray.bytesAvailable > 0)
                {
                    startBtn.enabled = true;
                    stopBtn.enabled = false;
                    playBtn.enabled = false;
                    return;
                }
                 
                for (var i:int = 0; i < 8192; i++)
                {
                    var audioSample:Number = 0;
                     
                    if (soundByteArray.bytesAvailable > 0)
                    {
                        audioSample = soundByteArray.readFloat();
                    }
                     
                    //调用writeFloat()方法两次是为了音频数据采样能同时命中左声道和右声道
                    e.data.writeFloat(audioSample);
                    e.data.writeFloat(audioSample);
                }
            }
             
        ]]>
    </fx:Script>
     
    <s:layout>
        <s:VerticalLayout paddingLeft="20" paddingRight="20" paddingBottom="20" paddingTop="20"/>
    </s:layout>
 
    <s:VGroup width="437" gap="20" horizontalAlign="center">
        <s:Label id="description" text="选择一个麦克风并开始录音..." height="30"/>
         
        <s:ComboBox id="soundCaptureDevices" width="397" height="55"
                    textAlign="center" focusEnabled="false"/>
         
        <s:HGroup width="437" gap="20" horizontalAlign="center">
         
            <s:Button id="startBtn" label="录音" chromeColor="#51B22F" click="startRecording()"/> 
             
            <s:Button id="stopBtn" label="停止" chromeColor="#CB0909" click="stopRecording()"
                      enabled="false"/> 
             
            <s:Button id="playBtn" label="播放" click="playRecording()" enabled="false"/>
             
        </s:HGroup>
             
    </s:VGroup>
</s:View>
评论1
  • 1楼
    2015-05-07 01:11
    立月柒

    谢谢分享 可以用

    站长回复

    不客气的。