使用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();
    }
}
相关推荐
djarmy1 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO91 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧1 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精1 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠2 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫2 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141912 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉2 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
小柯南敲键盘2 小时前
跨马翻译:AI批量图片翻译工具,跨境电商视频字幕翻译与智能抠图一体搞定
人工智能·python·音视频
秦老师Q3 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php