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

如何在JavaScript版UWP应用中捕获麦克风音频?寻求JS实现方案

嘿,很高兴帮到你!你提到的UWP JavaScript应用捕获麦克风音频的需求,其实完全可以实现——UWP的WinRT API对JavaScript是完全开放的,和C#用的是同一套底层接口,只是语法上适配了JS的异步特性而已。下面我给你两种常用的实现方案,涵盖基础捕获和更灵活的音频处理场景:

方案1:使用MediaCapture快速捕获麦克风音频(适合简单录音需求)

这个方案和C#里的MediaCapture逻辑一致,只是用JS的async/await来处理异步操作。核心是初始化捕获对象、请求权限,然后直接将麦克风音频录制到文件。

实现步骤&代码示例

  1. 先配置应用权限:在Package.appxmanifest的「功能」选项卡勾选「麦克风」,确保应用能访问硬件设备。
  2. 编写JS代码:
let mediaCaptureInstance;

// 初始化麦克风捕获
async function startMicrophoneCapture() {
    // 请求麦克风访问权限
    const accessStatus = await Windows.Media.Capture.MediaCapture.requestAccessAsync();
    if (accessStatus !== Windows.Media.Capture.MediaCaptureAccessStatus.allowed) {
        console.error("麦克风访问权限被拒绝,请检查应用设置");
        return;
    }

    try {
        // 初始化MediaCapture对象
        mediaCaptureInstance = new Windows.Media.Capture.MediaCapture();
        await mediaCaptureInstance.initializeAsync();

        // 配置音频编码格式(这里用MP3,也可以选WAV/AAC等)
        const encodingProfile = Windows.Media.Capture.MediaEncodingProfile.createMp3(
            Windows.Media.MediaProperties.AudioEncodingQuality.high
        );

        // 创建存储文件(保存到应用本地文件夹)
        const localFolder = Windows.Storage.ApplicationData.current.localFolder;
        const outputFile = await localFolder.createFileAsync(
            "recorded_audio.mp3",
            Windows.Storage.CreationCollisionOption.generateUniqueName
        );

        // 开始录制到文件
        await mediaCaptureInstance.startRecordToStorageFileAsync(encodingProfile, outputFile);
        console.log(`音频录制已开始,文件将保存至:${outputFile.path}`);
    } catch (err) {
        console.error("初始化捕获失败:", err);
    }
}

// 停止捕获并保存文件
async function stopMicrophoneCapture() {
    if (!mediaCaptureInstance) return;
    
    try {
        await mediaCaptureInstance.stopRecordAsync();
        console.log("音频录制已停止,文件已保存");
    } catch (err) {
        console.error("停止捕获失败:", err);
    }
}
方案2:使用AudioGraph实现精细化音频捕获与处理(适合实时效果、混音等场景)

如果需要对捕获的音频做实时处理(比如添加滤镜、混音),AudioGraph是更好的选择——它同样支持JavaScript调用,能实现更复杂的音频工作流。

实现步骤&代码示例

let audioGraph;
let microphoneInputNode;
let fileOutputNode;

async function initAudioGraphCapture() {
    // 先请求麦克风权限
    const accessStatus = await Windows.Media.Capture.MediaCapture.requestAccessAsync();
    if (accessStatus !== Windows.Media.Capture.MediaCaptureAccessStatus.allowed) {
        console.error("麦克风访问权限被拒绝");
        return;
    }

    try {
        // 配置AudioGraph设置
        const graphSettings = new Windows.Media.Audio.AudioGraphSettings(
            Windows.Media.Audio.AudioRenderCategory.media
        );
        graphSettings.desiredSamplesPerQuantum = 1024; // 调整采样块大小,影响延迟

        // 创建AudioGraph实例
        const graphResult = await Windows.Media.Audio.AudioGraph.createAsync(graphSettings);
        if (graphResult.status !== Windows.Media.Audio.AudioGraphCreationStatus.success) {
            console.error(`创建AudioGraph失败:${graphResult.status}`);
            return;
        }
        audioGraph = graphResult.graph;

        // 创建麦克风输入节点
        const inputResult = await audioGraph.createDeviceInputNodeAsync(
            Windows.Media.MediaProperties.MediaEncodingSubtype.pcm
        );
        if (inputResult.status !== Windows.Media.Audio.AudioDeviceNodeCreationStatus.success) {
            console.error(`创建麦克风输入节点失败:${inputResult.status}`);
            return;
        }
        microphoneInputNode = inputResult.deviceInputNode;

        // 创建文件输出节点(保存为WAV格式)
        const localFolder = Windows.Storage.ApplicationData.current.localFolder;
        const outputFile = await localFolder.createFileAsync(
            "audiograph_capture.wav",
            Windows.Storage.CreationCollisionOption.generateUniqueName
        );
        const encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createWav(
            Windows.Media.MediaProperties.AudioEncodingQuality.high
        );
        const outputResult = await audioGraph.createFileOutputNodeAsync(outputFile, encodingProfile);
        if (outputResult.status !== Windows.Media.Audio.AudioFileOutputNodeCreationStatus.success) {
            console.error(`创建文件输出节点失败:${outputResult.status}`);
            return;
        }
        fileOutputNode = outputResult.fileOutputNode;

        // 连接输入节点到输出节点(如果需要加效果,中间可以插处理节点)
        microphoneInputNode.addOutgoingConnection(fileOutputNode);

        // 启动AudioGraph开始捕获
        audioGraph.start();
        console.log(`AudioGraph开始捕获,文件将保存至:${outputFile.path}`);
    } catch (err) {
        console.error("初始化AudioGraph捕获失败:", err);
    }
}

// 停止AudioGraph捕获
async function stopAudioGraphCapture() {
    if (!audioGraph) return;
    
    try {
        audioGraph.stop();
        await fileOutputNode.finalizeAsync(); // 确保文件写入完成
        console.log("AudioGraph捕获已停止,文件已完成保存");
    } catch (err) {
        console.error("停止AudioGraph捕获失败:", err);
    }
}

额外注意事项

  • 权限细节:如果需要将录制的音频保存到公共文件夹(比如图片库),还需要在Package.appxmanifest中声明对应的库权限(如picturesLibrary)。
  • 设备兼容性:部分设备可能不支持某些编码格式,建议添加格式兼容性检查。
  • 实时处理扩展:如果需要实时处理音频,可以在输入和输出节点之间添加AudioFrameInputNode或AudioEffect来实现自定义音效。

内容的提问来源于stack exchange,提问作者Alen Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:41:17