使用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();
    }
}
相关推荐
是立不是利32 分钟前
大文件导致请求被拒的连锁反应
开发语言·前端·javascript
野生技术架构师1 小时前
1200 道 JAVA 面试题(各大企业常见面试题及答案)
java·开发语言
鱼听禅1 小时前
C# 学习笔记-使用 类型化客户端搭建HTTP客户端服务
学习·http·c#·工厂方法模式
“AI国潮设计-小江”1 小时前
【Python/SDXL实战】潮汕国潮IP视觉落地:普宁美食猫IP & 创意甜品设计(附ComfyUI工作流思路)
开发语言·人工智能·python·prompt·aigc
纽格立科技1 小时前
纽格立参展IBC 2026——DRM端到端全链路方案,展位Hall 8 F71
车载系统·音视频·信息与通信·传媒
Yyyyyy~1 小时前
【java】类和对象
java·开发语言
草莓熊Lotso1 小时前
【Redis 进阶】主从复制深度解析:从配置落地到 PSYNC 同步原理
linux·开发语言·网络·数据库·redis·缓存·php
Joy T2 小时前
Spring AI 2.0 进阶入门:Workflow、Routing、Task State 与可控 Agent
开发语言·人工智能·workflow·routing·springai·orchestrator·evaluator
重生之小比特2 小时前
【Java SE】抽象类和接口
java·开发语言
传奇开心果编程2 小时前
【Rust入门知识点学与练】第33课:异步编程入门(async/await)强化
开发语言·学习·rust