如何使用Java+Playwright录制浏览器/系统音频(Windows10环境)
在Java+Playwright+Windows 10环境录制通话前5秒音频
一、优先方案:捕获浏览器专属音频
Playwright本身无原生音频录制能力,需结合Windows核心音频API与Java库实现精准捕获:
1. 定位浏览器音频会话
Windows为每个进程分配独立音频会话,通过JNA调用Core Audio API枚举会话,匹配Playwright启动的Chromium进程ID,锁定目标音频流。核心思路代码(依赖JNA):// 获取Playwright Chromium进程ID Browser browser = playwright.chromium().launch(); long pid = browser.process().pid(); // 借助JNA调用Core Audio API,枚举音频会话并匹配pid(需自行封装接口)2. 录制并保存音频
使用javax.sound.sampled库捕获目标会话音频流,录制5秒后保存为WAV文件:AudioFormat format = new AudioFormat(44100, 16, 2, true, true); TargetDataLine captureLine = AudioSystem.getTargetDataLine(format); // 通过Core Audio API将captureLine绑定到浏览器音频会话 captureLine.open(format); captureLine.start(); ByteArrayOutputStream audioBuffer = new ByteArrayOutputStream(); byte[] tempBuffer = new byte[4096]; long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < 5000) { int read = captureLine.read(tempBuffer, 0, tempBuffer.length); audioBuffer.write(tempBuffer, 0, read); } // 写入本地文件 AudioSystem.write( new AudioInputStream(new ByteArrayInputStream(audioBuffer.toByteArray()), format, audioBuffer.size() / format.getFrameSize()), AudioFileFormat.Type.WAVE, new File("call_start.wav") ); captureLine.stop(); captureLine.close();依赖与权限
需引入JNA依赖:<!-- Maven依赖 --> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.13.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.13.0</version> </dependency>程序需以管理员权限运行,否则无法访问系统音频会话。
二、替代方案:录制系统全局音频
若浏览器会话捕获实现复杂,可直接录制系统输出音频,步骤更简便:
1. 启用Windows立体声混音
打开Windows声音设置→录制选项卡→右键显示禁用设备→启用「立体声混音」,作为音频捕获源。2. 用JavaCV实现录制
借助JavaCV封装的FFmpeg接口快速实现系统音频录制:FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("audio=立体声混音"); grabber.setFormat("dshow"); grabber.setSampleRate(44100); grabber.start(); FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("call_start.wav", 2); recorder.setFormat("wav"); recorder.setSampleRate(44100); recorder.start(); long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < 5000) { Frame frame = grabber.grab(); if (frame != null) recorder.record(frame); } recorder.stop(); grabber.stop();依赖说明
引入JavaCV Maven依赖:<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.9</version> </dependency>
三、结合Playwright触发录制时机
要精准在通话开始时启动录制,需监听网页的通话触发事件:
// 示例:监听通话按钮点击后启动录制 page.locator("#start-call-btn").click(); new Thread(() -> { // 执行上述录制逻辑 }).start(); // 或监听通话状态变化后启动录制 page.waitForSelector("#call-status:text('已接通')").then(__ -> { new Thread(() -> { // 执行录制 }).start(); });
内容的提问来源于stack exchange,提问作者Lilpercy11
相关产品推荐
相关产品推荐

