Flash AS3录音 回放 保存文件功能研究

前天收到一个朋友的问题,是关于AS3能不能录音并播放的问题,我虽然没做过,但基于对AS3的部分了解,毫不犹豫地回答他:可以。

说起来是简单,当时也没想那么多,以前只简单测试过AS3调用摄像头的功能,心想这个就是麦克风,应该也差不多吧。

出于好奇,真想整出这个功能来看看,研究了这两天,终于做出来了。虽然现在看来,不算复杂,但其中确实有些曲折。

先看下效果吧:

下面分享下中间的曲折:

首先是打开AS3 官方API查阅下相关的对象,我在本地IIS上放了AS3相关的大部分API,所以查阅起来很方便。这里是官方API地址 当然,我们国内一般打开速度没那么快,所以我还是下载了个压缩包放在本地。下载地址我现在也找不到了,偶尔会在开发中心里放出来,偶尔会上中文版。

好了,不废话了。MicroPhone这个类在flash.media包下,获取麦克风用

//获取可以执行回音消除功能的增强的 Microphone 对象
var micro:MicroPhone=MicroPhone.getEnhancedMicrophone();
//或
micro= Microphone.getMicrophone();

两个方法,一般用后面的就可以了。要开始录音之前可以先设定下几个参数

micro.setSilenceLevel(0, 10000);
micro.gain = 50;
micro.rate = 44;
//监听用户是否同意使用麦克风
micro.addEventListener(StatusEvent.STATUS, mic_status);

然后绑定SampleDataEvent事件,在SampleDataEvent事件里把Event传过来的data写入一个事先声明的ByteArray里,就开始录音了。

var soundbyte:ByteArray=new ByteArray();
micro.addEventListener(SampleDataEvent.SAMPLE_DATA, function(e:SampleDataEvent):void{
while(e.data.bytesAvailable)
soundbyte.writeFloat(e.data.readFloat());
});

结束录音就是取消SampleDataEvent事件的绑定。录好的音就在那个ByteArray里。关键问题是,怎么把这个ByteArray播放出来,怎么编码成声音文件的格式保存。

我一开始想的是有一个Sound对象,看能不能直接加载。但查阅了下手册,有两个方法

但是看说明,loadCompressedDataFromByteArray似乎是用来加载MP3格式的,loadPCMFromByteArray似乎是直接加载ByteArray的,但说明上有很多限制,比如长度,版本的限制。说实话,这些没看多明白,还是以事实为准吧,一个一个拿来测试,首先loadCompressedDataFromByteArray不能一次加载整个ByteArray,报错是数据不能超过40k,于是切分开加载,又报错格式不对,这个看来是不行了。再试loadPCMFromByteArray,怎么都是报数据不能超过40k,API上的参数又写的不清不楚的(可能是我对音频这方面没什么了解)。没办法,去网上找找看吧。

首先搜索到的一篇文章是用NetStream和NetConnection通过本地rtmp服务器来做的,先是microphone传送数据到服务器,sound再从服务器加载,这做法实在麻烦,就没去测试。

其次找到的一篇是引用了org.as3wavsound包中的wav编码,解码的功能做的。这个还算靠谱,于是找到相关包下载来。按着功能大体写了出来,声音是出来了,但是怎么听着不舒服,音质太差了,而且保存的WAV文件数据有问题,要么就是保存的WAV文件正常(质量差点),在flash中播放出来的是叽叽呱呱的声音。也不管是哪里的问题了,反正不好用,很多参数不容易控制。看了相关的文件,大体了解了WAV编码方法,想单独摘出来做。

想来想去,还是再看下API,这次看了仔细点,文档中有链接到官网的一些示例代码,有一篇处理动态生成的音频,讲到了直接在Sound对象上绑定SampleDataEvent事件,在事件中写入二进制可以直接播放。找来找去,还是官方靠谱,其实MicroPhone录下的音频,不用做任何处理,直接写给Sound就可以了,只不过录制的时候最好以rate=44来录制,写入的时候单声道做双声道写入,试了下,音质还可以。然后又写了WAV编码相关的部分,可以直接保存出WAV文件。调试了几次,效果还算满意,又从这个小功能学了不少东西。Flash是越来越强大了。

另外需要注意的是,其中某些方法是11.7以上版本才支持的,所以开发环境最好用最新的SDK。

 

源码下载: http://pan.baidu.com/s/1o6oWZ7W   提取密码 rcvg