Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

AS3录音

  关于AS3的录音,网络上搜一下基本都是使用FMS或MicRecorder的。实际上Microphone类自身就提供了音频数据采样功能,只要把这些采样数据加上个WAV头就可以得到WAV格式的音频文件。这可以在客户端完成后保存到本地,也可以服务器完成后保存到服务器。
  整个录音程序太复杂了,还用到了一些控件,直接贴代码也无法编译,下面我只把关键代码贴出来。首先是Microphone类需要引入,它在flash.media包中。
import flash.media.Microphone;   然后,我们就可以创建Microphone对象了,至于在何处创建应该视具体需求而定。可以是全局的,也可以是局部的。
var mic:Microphone=Microphone.getMicrophone();
mic.rate=11; //采样频率(11K)
  创建之后还需要配置一些属性,其中最重要的就是rate属性,它表示采样比率,单位是KHz。这个属性直接影响到采样块的大小。至于其它属性,都是一些辅助功能,参考官方文档即可。接着要为这个对象添加事件
var data=new ByteArray;
mic.addEventListener(SampleDataEvent.SAMPLE_DATA,mic_sampleData);
function mic_sampleData(e:SampleDataEvent):void {
  data.writeBytes(e.data); //当麦克风有数据输入时存入data中
};
  SAMPLE_DATA事件会在麦克风有声音输入时触发,每次触发会根据设置的采样比率得到波形数据。我们要把这个波形属性保存下来,所以需要在这个事件外定义一个用于记录每次事件触发时得到的波形数据。如果是做一个录音机,就需要在录制期间记录这个事件的数据。
  此外,这个事件中得到的波形数据,其采样频率就是前面使用mic.rate设置,声道也总是单声道的。而且有一个非常特殊的地方是,数据中的每个采样点是32位的浮点数,取值范围是-1到1。而PCM方式的WAV文件使用的是整型,如果需要把录制的数据做成文件就要把这些浮点数据平均分布到一个整型的数据范围中。下面是把录制数据转换为WAV文件数据的函数
function makeWavFile(data:ByteArray):ByteArray {
  //配置输出wav的参数
  var channels:uint=1; //声道数量
  var bits:uint=16; //采样点大小
  var rate:uint=11025; //采样频率
  var size:uint=channels*(bits/8); //采样块大小
  var len:uint=data.length/2; //数据长度(float到short所以除以2)
  var buf:ByteArray=new ByteArray;
  buf.endian=Endian.LITTLE_ENDIAN;
  buf.writeUTFBytes('RIFF');
  buf.writeInt(uint(len+44));
  buf.writeUTFBytes('WAVE');
  buf.writeUTFBytes('fmt ');
  buf.writeInt(uint(16));
  buf.writeShort(uint(1));
  buf.writeShort(channels);
  buf.writeInt(rate);
  buf.writeInt(uint(rate*size));
  buf.writeShort(uint(size));
  buf.writeShort(bits);
  buf.writeUTFBytes('data');
  buf.writeInt(len);
  //Microphone类的采样点是float类型的
  //而wav文件需要整型数据,所以这里有一个转换
  data.position=0;
  while(data.bytesAvailable)
    buf.writeShort(data.readFloat()*0x8000|0);
  buf.position=0;
  return buf;
};
  这个函数就是按照WAV文件格式写入数据,其中的配置参数应保持与录制时的参数相同。采样点大小16位意味着后面的转换应该把浮点数转换成16位整型,当然也可以用32位的,后面的转换用32位整型即可。
  这么几个过程就可以实现录制和做成文件数据。在Web上使用的话可以直接向服务器传输数据部分,让服务器自己去计算WAV头后再储存。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^