使用NAudio录制wav音频

NAudio

NAudio官网

环境

Unity2019.4.34f1c1

Window10

NAudio 1.10 .Net 3.5

录制音频

WaveInEvent类可录制音频

  1. StartRecording方法 启用录制
  2. StopRecording方法 停止录制
  3. DataAvailable 录制中回调
  4. RecordingStopped 录制结束回调

WaveFileWriter类可存储音频

Write方法可存储音频

检测麦克风设备数量

WaveIn.DeviceCount 返回音频捕获设备数量

注意

台式电脑,可能需要插入耳机才可以启用麦克风

示例

  1. 检测到麦克风,显示开始录制按钮
  2. 点击开始录制按钮,显示停止录制按钮
  3. 点击停止录制按钮,回到步骤1
csharp 复制代码
using NAudio.Wave;
using System;
using System.IO;
using UnityEngine;

public class RecordNAudio : MonoBehaviour
{
    bool recording;

    string outputFolder;
    string outputFilePath
    {
        get
        {
            return Path.Combine(outputFolder, DateTime.Now.ToString("yyyyMMddHHmmss") + ".wav");
        }
    }

    WaveInEvent waveIn;
    WaveFileWriter writer;

    private void Awake()
    {
        recording = false;

        outputFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "NAudio");

        if (!Directory.Exists(outputFolder))
            Directory.CreateDirectory(outputFolder);

        waveIn = new WaveInEvent();
        waveIn.DataAvailable += Recording;
        waveIn.RecordingStopped += RecordingStopped;

        writer = null;
    }

    private void OnGUI()
    {
        if (recording == false)
        {
            if (WaveIn.DeviceCount > 0)
            {
                if (GUILayout.Button("开始录制"))
                {
                    writer = new WaveFileWriter(outputFilePath, waveIn.WaveFormat);
                    waveIn.StartRecording();
                    recording = true;
                }
            }
            else
                GUILayout.Label("无法启用麦克风,请在主机上插入耳机,尝试启用麦克风");            
        }
        else
        {
            if (GUILayout.Button("停止录制"))
            {
                waveIn.StopRecording();
                recording = false;
            }
        }
    }

    private void Recording(object sender, WaveInEventArgs e)
    {
        if (writer != null)
            writer.Write(e.Buffer, 0, e.BytesRecorded);
    }

    private void RecordingStopped(object sender, StoppedEventArgs e)
    {
        if (writer != null)
            writer.Dispose();
        writer = null;
        waveIn.Dispose();
    }
}
相关推荐
belldeep2 小时前
如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
c语言·开发语言
LuckyTHP2 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
Blossom.1185 小时前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
da-peng-song5 小时前
ArcGIS Desktop使用入门(二)常用工具条——数据框工具(旋转视图)
开发语言·javascript·arcgis
galaxy_strive5 小时前
qtc++ qdebug日志生成
开发语言·c++·qt
TNTLWT5 小时前
Qt功能区:简介与安装
开发语言·qt
科技小E5 小时前
EasyRTC嵌入式音视频通信SDK打造带屏IPC全场景实时通信解决方案
人工智能·音视频
CoderIsArt5 小时前
参数系统的基类Parameter抽象类
c#
等等5436 小时前
Java EE初阶——wait 和 notify
java·开发语言
低代码布道师6 小时前
第五部分:第一节 - Node.js 简介与环境:让 JavaScript 走进厨房
开发语言·javascript·node.js