Windows Phone 7 – 写一个会Record Audio的录音程式

来源:互联网 发布:centos中文输入法 编辑:程序博客网 时间:2024/05/19 16:47

Windows Phone 7 – 写一个会Record Audio的录音程式

时间:2011-11-06 20:44来源:dotblogs作者:pou 点击:929次
过去在唸书的时候总是会看到同学带着录音笔去参加meeting或是上课,担心会漏掉上课的种种内容,随着智慧手机的发展, 有很多App都方便地透过内键的麦克风录下声音,不需在另外带一个设备来录音。然而录音的程式在Windows Mobile时代很容易做到, 透过一些内键的API与取
  

  过去在唸书的时候总是会看到同学带着录音笔去参加meeting或是上课,担心会漏掉上课的种种内容,随着智慧手机的发展,

  有很多App都方便地透过内键的麦克风录下声音,不需在另外带一个设备来录音。然而录音的程式在Windows Mobile时代很容易做到,

  透过一些内键的API与取得麦克风的Instance即可以完成功能,那么在WP7内要怎么实作呢?往下便仔细的来介绍有那些API可以使用。

  〉Micorsoft.Xna.Framework.Audio:

  在WP7裡,要实作一个支援录音的程式,主要是透过Micorsoft.Xna.Framework.Audio裡的Microphone类别,

  由于相关多媒体资源存取的功能都纳入在XNA系列裡,相关图片、音乐、影片这些资源要使用到XNA的Dll就对了。

  不过这有点扯远了,接下来在介绍撰写一个录音程式前,有几个重要的类别我觉得要先认识一下:

  a. Microphone Class:

  该类别提供了丰富的属性、方法与事件来透过手机麦克风来撷取声音。在使用前有几个重要的属性(均是唯读):类别名称说明属性All静态属性,回传目前设备可用的麦克风集合。例如:手机内键的麦克风、蓝芽耳机的麦克风或连接式耳麦。 Default静态属性,回传预设设备使用的麦克风类型。如果回传是null代表该设备不支援麦克风,预设麦克风即为手机的内键麦克风。 BufferDuration设定/取得麦克风撷取声音时,录音资料写入缓衝区对应的容纳时间长度。换句话说,为撷取声音长度达到设定的缓衝大小时,代表已达容纳时间长度需触发BufferReady事件。

举个例子说明:当设定「Microphone.BufferDuration = TimeSpan.FromMilliseconds(1000)」代表当麦克风撷取声音长达1秒后,立刻触发BufferReady事件。

BufferDuration可设定容纳时间範围:100毫秒至1000毫秒(1秒)
。超过或低于会发生ArgumentOutOfRangeException例外事件。
 IsHeadset识别目前设备是否有外接麦克风,不管是接线式或蓝芽耳机,如果有为true;没有为false。 SampleRate回传麦克风撷取声音资料的採样率,以Hertz (Hz)为单位。 State回传麦克风目前运作的状态,值为MicrophoneState列举,包括:Started、Stoped。   方法GetData取得由麦克风撷取声音资料的最新缓衝区资料,以byte array为单位。
该方法为多载的方式,可以指定要撷取的範围(Byte[], start, length)或是整个Byte[]回传。 GetSampleDuration回传指定麦克风录音的资料大小为对应的时间长度。举例来说,录音声音byte array大小为3200,透过「TimeSpan duration = Microphone.GetSampleDuration(totalSize)」指定取得的回传值为约7秒。 GetSampleSizeInBytes回传指定麦克风录音的容纳时间长度对应于Bytes的大小,该回传值代表该录音档案需要byte arrray大小。 Start启动录音程序。 Stop结束录音程序。   事件BufferReady当撷取声音的缓衝被填满后,即触发该事件。代表实作该事件时,可以透过GetData方法取得目前已被写入缓衝的录音资料(byte array)。

  由上表可以看出几个重要的属性:

  BufferDuration:指定要录音的时间长度,透过TimSpan做为设定的时间长度,以毫秒为单位;

  GetSampleSizeInBytes:根据指定的时间长度转换成对于byte arrary的大小;

  BufferReady:代表该事件触发时,可以取得真正被录好的binary资料,将binary资料写成档案即可以进行播放。

  [注意事项]

  在使用Microphone类别进行录音时,有一件事是需要注意的那就是需要去执行:「FrameworkDispatcher.Update();」。

  为什么呢?由于在XNA中每33fp就会更新画面一次,但在Silverlight Application并没有这样的机制,为了确保录音的功能

  持续的更新状态与进行撷取动作,因此,需要透过指定一个定期执行「FrameworkDispatcher.Update();」的事件。

  详细说可参考。