如何在Chromium中通过Playwright向虚拟麦克风输入音频?
解决方案:在Playwright中用音频文件模拟麦克风输入
你遇到的问题核心是SetInputFilesAsync()仅适用于文件上传控件,和麦克风媒体流完全无关,所以没法用它来模拟麦克风输入。下面提供两种可行的方案,根据你的测试场景选择:
方案1:用Chromium原生命令行参数静态指定音频文件
Chromium本身支持通过命令行参数直接将WAV文件作为虚拟麦克风的输入源,这是最简单的静态模拟方式:
步骤:
- 确保你的音频文件是PCM编码的WAV格式(16位深度,44.1kHz或48kHz采样率),如果是MP3需要先转码(比如用ffmpeg命令:
ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 output.wav)。 - 在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:
步骤:
- 在页面加载时注入脚本,覆盖
navigator.mediaDevices.getUserMedia,当请求音频权限时,加载指定的音频文件并解码为MediaStream返回。 - 点击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
相关产品推荐
相关产品推荐

