You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure部署.NET Core 6+NAudio录音遇BadDeviceId错误及相关疑问

问题解答

疑问1:调用的是本地还是服务器音频设备?

你的现有代码运行在Azure服务器端,会尝试调用Azure服务器的音频输入设备,而非用户本地的麦克风。但Azure云服务器默认没有配备物理音频输入硬件,这就是触发「BadDeviceId calling waveInOpen」错误的核心原因——服务器找不到可用的音频输入设备。

疑问2:如何让Azure部署的应用通过浏览器正常录制音频?

Web应用要访问用户本地麦克风,必须通过浏览器前端API实现,后端代码无法直接跨网络访问客户端设备。具体操作步骤如下:

1. 前端通过浏览器API录制音频

使用浏览器原生的MediaRecorder API请求用户麦克风权限,在客户端完成音频录制:

// 发起麦克风授权并启动录制
async function startLocalRecording() {
    try {
        // 请求麦克风访问权限,指定采样率、声道数匹配原需求
        const audioStream = await navigator.mediaDevices.getUserMedia({ audio: { sampleRate: 16000, channelCount: 1 } });
        const recorder = new MediaRecorder(audioStream);
        const audioChunks = [];

        // 收集录制的音频片段
        recorder.addEventListener("dataavailable", (e) => {
            audioChunks.push(e.data);
        });

        // 录制结束后发送音频到后端
        recorder.addEventListener("stop", async () => {
            const audioBlob = new Blob(audioChunks, { type: "audio/wav" });
            await uploadAudioToBackend(audioBlob);
            audioStream.getTracks().forEach(track => track.stop()); // 释放麦克风资源
        });

        recorder.start();
        // 示例:录制3秒后停止,可根据业务逻辑调整停止时机
        setTimeout(() => recorder.stop(), 3000);
    } catch (err) {
        console.error("麦克风访问失败或录制出错:", err);
    }
}

// 上传音频文件到后端接口
async function uploadAudioToBackend(audioBlob) {
    const formData = new FormData();
    formData.append("recording", audioBlob, `mic_recording_${Date.now()}.wav`);

    const response = await fetch("/api/audio/upload", {
        method: "POST",
        body: formData
    });

    if (!response.ok) {
        console.error("音频上传失败");
    }
}

2. 后端接收并处理音频文件

在Azure部署的C#后端中,编写接口接收前端传来的音频文件,建议将文件保存到Azure Blob Storage(避免App Service本地存储的临时性):

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Azure.Storage.Blobs;

[ApiController]
[Route("api/audio")]
public class AudioController : ControllerBase
{
    private readonly BlobServiceClient _blobServiceClient;

    // 注入Azure Blob客户端,需在Program.cs中配置连接字符串
    public AudioController(BlobServiceClient blobServiceClient)
    {
        _blobServiceClient = blobServiceClient;
    }

    [HttpPost("upload")]
    public async Task<IActionResult> UploadAudio(IFormFile recording)
    {
        if (recording == null || recording.Length == 0)
        {
            return BadRequest("未上传有效音频文件");
        }

        try
        {
            // 获取Blob容器(需提前在Azure Portal创建)
            var containerClient = _blobServiceClient.GetBlobContainerClient("audio-recordings");
            await containerClient.CreateIfNotExistsAsync();

            // 生成唯一文件名
            var blobName = $"mic_{Guid.NewGuid()}.wav";
            var blobClient = containerClient.GetBlobClient(blobName);

            // 上传音频流到Blob Storage
            using var stream = recording.OpenReadStream();
            await blobClient.UploadAsync(stream, true);

            return Ok(new { BlobUrl = blobClient.Uri.ToString() });
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"音频保存出错:{ex.Message}");
        }
    }
}

关键说明

  • 原有的NAudio代码运行在服务器端,只能访问服务器本地设备,在Azure环境下不适用。必须将录制逻辑转移到前端,后端只负责接收和存储音频数据。
  • 前端需确保网站使用HTTPS(Azure App Service默认支持),因为浏览器仅允许HTTPS网站请求麦克风权限。

内容的提问来源于stack exchange,提问作者Hamza Hamid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:05:28