zoukankan      html  css  js  c++  java
  • Windows Phone 录制音频

      Windows Phone 提供的访问麦克风的类为 Microsoft.Xna.Framework.Audio.Microphone ,该类属于 XNA Framework , 若要在 Silverlight 中访问 Windows Phone 麦克风,同样需要使用此类。所以需要添加引用 Microsoft.Xna.Framework。
      1.声明局部变量,获取麦克风单例。

            //麦克单例
    private Microphone microphone = Microphone.Default;
    //每次捕获音频缓存
    private byte[] buf;
    //音频流存储区
    private MemoryStream audioStream;

      2.由于在XNA中每33fp就会更新画面一次,但在Silverlight Application并没有这样的机制,为了确保录音的功能持续的更新状态与进行撷取动作,因此,需要透过指定一个定期执行 FrameworkDispatcher.Update() 的事件。

            //设置定时器
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromMilliseconds(33);
    timer.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
    timer.Start();

      3.设置录音相关信息,启动录音。

            //设置1秒的缓存区,没获取1秒音频就会调用一次BufferReady事件
    microphone.BufferDuration = TimeSpan.FromMilliseconds(1000);
    //分配1秒音频所需要的缓存区
    buf = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)];
    audioStream = new MemoryStream();
    //BufferReady事件
    microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady);
    //启动录音
    microphone.Start();

      3.实现 BufferReady 事件处理程序。该处理程序将麦克风的数据复制到缓冲区中并将该缓冲区写入一个流。

            void microphone_BufferReady(object sender, EventArgs e)
    {
    //将麦克风的数据复制到缓冲区中
    microphone.GetData(buf);
    //将该缓冲区写入一个流
    audioStream.Write(buf, 0, buf.Length);
    }

      4.停止录音

            //停止录音
    microphone.Stop();
    microphone.BufferReady -= new EventHandler<EventArgs>(microphone_BufferReady);
    audioStream.Flush();
    //将数据流转换为byte,recording中即为音频数据
    byte[] recording = audioStream.ToArray();
    audioStream.Dispose();

      5.播放录音

            //播放录音
    SoundEffect sound = new SoundEffect(audioStream.ToArray(), microphone.SampleRate, AudioChannels.Mono);
    sound.Play();

      通过录制的byte字节流数据,可以通过SoundEffect类播放,相当容易。但是如果想通过其他方式播放或在要到处音频数据,则需要将音频数据以文件的方式保存到独立存储中。关于录制音频的保存将在后续介绍。

  • 相关阅读:
    elasticsearch query 和 filter 的区别
    java 模拟简单搜索
    filterBuilders 构建过滤器query
    elasticsearch java 索引操作
    lesson4:利用jmeter来压测数据库
    lesson3:使用java代码的方式对不能识别的协议进行压力测试
    lession2:使用HTTP Cookie 管理器来传递cookies值
    lesson1:压测普通网页
    php mysql find_in_set函数 检索单子段 逗号分隔序列
    写出一种排序算法(要写出代码),并说出优化它的方法。(新浪面试题)
  • 原文地址:https://www.cnblogs.com/huizhang212/p/Microphone.html
Copyright © 2011-2022 走看看