如何使用Electron实现跨平台音视频录制 解决Linux桌面音频采集问题
可行解决方案
针对Linux下Chromium内核不支持桌面音频采集的问题,有三种落地性较强的实现路径:
方案1:单独采集桌面音频+音视频合并(最易实现)
保留你现有的屏幕录制逻辑不变,Linux环境下单独调用系统能力采集音频,录制结束后合并音视频文件,步骤如下:
- 做系统适配:Windows、macOS环境继续使用原有
desktopCapturer的音频采集逻辑,仅Linux环境走单独音频采集流程 - 音频采集:调用FFmpeg采集PulseAudio输出的桌面音频,也可指定采集单个应用的音频流
- 采集全桌面音频命令示例:
ffmpeg -f pulse -i default -ac 2 -ar 44100 audio.wav - 采集指定应用音频:先执行
pactl list sink-inputs获取对应应用的流ID,替换命令中的default为对应ID即可
- 采集全桌面音频命令示例:
- 音视频合并:录制结束后调用FFmpeg合并你原有逻辑输出的视频文件和单独采集的音频文件,命令示例:
ffmpeg -i 你的视频文件.webm -i 你的音频文件.wav -c:v copy -c:a opus 最终输出文件.webm,该命令直接拷贝视频流无需二次编码,处理速度极快
你可以直接用ffmpeg-static这个npm包把FFmpeg二进制打包进你的Electron应用,不需要依赖用户系统预装FFmpeg,调用时直接引用包内置的二进制路径即可。
方案2:用Node.js音频采集库直接读音频流
使用naudiodon这个跨平台Node.js音频IO库,Linux下可直接读取PulseAudio设备的PCM音频数据,你可以自行编码为opus等格式,再和视频流合并输出,适合需要实时处理音频流的场景。
注意事项
- 要做音画同步校准:录制音频和视频时同时记录启动时间戳,合并时如果有偏移可以用FFmpeg的
-itsoffset参数调整对齐 - 如果需要低延迟实时预览音频,可以把采集到的音频流注入AudioContext播放即可
简化示例代码(FFmpeg音频采集+合并逻辑)
const ffmpegPath = require('ffmpeg-static'); const { spawn } = require('child_process'); const fs = require('fs'); // Linux下启动音频采集 let audioProcess, audioWriteStream; function startAudioCapture(audioSavePath) { audioWriteStream = fs.createWriteStream(audioSavePath); audioProcess = spawn(ffmpegPath, [ '-f', 'pulse', '-i', 'default', '-ac', '2', '-ar', '44100', '-y', audioSavePath ]); } // 录制结束后合并音视频 function mergeAudioVideo(videoPath, audioPath, outputPath, callback) { const mergeProcess = spawn(ffmpegPath, [ '-i', videoPath, '-i', audioPath, '-c:v', 'copy', '-c:a', 'opus', '-y', outputPath ]); mergeProcess.on('close', (code) => { if(code === 0) callback(null, outputPath); else callback(new Error('合并失败')); }); }
内容的提问来源于stack exchange,提问作者Arthur Isnt original
相关产品推荐
相关产品推荐

