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

如何在Chromium中通过Playwright向虚拟麦克风输入音频?

解决方案:在Playwright中用音频文件模拟麦克风输入

你遇到的问题核心是SetInputFilesAsync()仅适用于文件上传控件,和麦克风媒体流完全无关,所以没法用它来模拟麦克风输入。下面提供两种可行的方案,根据你的测试场景选择:

方案1:用Chromium原生命令行参数静态指定音频文件

Chromium本身支持通过命令行参数直接将WAV文件作为虚拟麦克风的输入源,这是最简单的静态模拟方式:

步骤:

  1. 确保你的音频文件是PCM编码的WAV格式(16位深度,44.1kHz或48kHz采样率),如果是MP3需要先转码(比如用ffmpeg命令:ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 output.wav)。
  2. 在Playwright启动Chromium时添加以下命令行参数:
    • --use-fake-device-for-media-stream:启用虚拟媒体设备(你已配置此参数,所以UI显示fake input device)
    • --use-file-for-fake-audio-capture=你的WAV文件绝对路径:指定作为麦克风输入的音频文件

C#代码示例:

using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Args = new[]
    {
        "--use-fake-device-for-media-stream",
        "--use-file-for-fake-audio-capture=C:\\path\\to\\your\\audio.wav"
    },
    // 其他启动参数...
});

var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    Permissions = new[] { "microphone" }
});
var page = await context.NewPageAsync();
// 后续操作:点击Test按钮启动录制,此时浏览器会自动使用指定的WAV文件作为麦克风输入

方案2:动态模拟麦克风流(支持测试中切换音频)

如果需要在测试过程中动态切换音频文件,或者要直接模拟MP3输入,可以通过Web Audio API mock getUserMedia方法,返回自定义的MediaStream:

步骤:

  1. 在页面加载时注入脚本,覆盖navigator.mediaDevices.getUserMedia,当请求音频权限时,加载指定的音频文件并解码为MediaStream返回。
  2. 点击Test按钮后,页面调用麦克风时会自动使用你提供的音频流。

C#代码示例:

var page = await context.NewPageAsync();

// 注入mock脚本
await page.AddInitScriptAsync(@"
    async function mockMicrophone(audioUrl) {
        const originalGetUserMedia = navigator.mediaDevices.getUserMedia;
        navigator.mediaDevices.getUserMedia = async (constraints) => {
            if (constraints.audio) {
                // 加载音频文件
                const response = await fetch(audioUrl);
                const arrayBuffer = await response.arrayBuffer();
                const audioContext = new (window.AudioContext || window.webkitAudioContext)();
                const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
                
                // 创建MediaStream
                const source = audioContext.createBufferSource();
                source.buffer = audioBuffer;
                const destination = audioContext.createMediaStreamDestination();
                source.connect(destination);
                source.start();
                
                // 循环播放(可选,模拟持续麦克风输入)
                source.onended = () => {
                    source.start();
                };
                
                return destination.stream;
            }
            return originalGetUserMedia(constraints);
        };
    }
    // 调用mock,传入音频文件的URL(可以是本地文件路径或测试服务器上的地址)
    mockMicrophone('http://your-test-server/audio.mp3');
");

// 点击Test按钮启动录制
await page.ClickAsync("[text='Test']");

注意点:

  • 如果使用本地音频文件,需要确保Playwright的页面能访问到该文件(可以通过page.SetContentAsync嵌入,或者将文件放在测试服务器上)。
  • 这种方法支持MP3等多种格式,因为Web Audio API会自动解码。

内容的提问来源于stack exchange,提问作者David M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:57:48