如何将Electron中getUserMedia生成的MediaStream接入OBS、VLC及直播平台
实现方案
你已经获取到了捕获窗口的MediaStream,可根据你的使用场景选择以下方案接入目标平台:
方案1:创建虚拟摄像头(最通用,适配OBS、VLC等本地程序)
这个方案是将MediaStream的音视频帧推送到系统级的虚拟摄像头/虚拟声卡设备,所有支持调用本地音视频设备的程序都可以直接识别使用:
- 安装对应平台的虚拟设备驱动:Windows可使用VB-Cable(虚拟音频)+ 虚拟摄像头驱动,Mac可使用OBS Virtual Camera附带的驱动,Linux可使用v4l2loopback
- Electron端修改
handleStream逻辑:将MediaStream绑定到一个隐藏的<video>标签,定时通过canvas.drawImage()捕获视频帧,转成YUV/RGB原始帧数据后通过Node.js原生模块推送到虚拟摄像头设备;音频流可同理转成PCM数据推送到虚拟声卡 - 后续OBS、VLC等程序直接在音视频输入源列表中选择你创建的虚拟设备即可使用
方案2:RTMP推流(适配直播平台、VLC、OBS)
这个方案无需额外安装驱动,适合推流到公网直播平台,也可本地分发:
- 执行
npm install fluent-ffmpeg安装依赖,将MediaStream的视频帧、音频帧实时喂给FFmpeg进程 - 本地测试时可推流到本地RTMP端口(如
rtmp://localhost:1935/live/mystream),OBS添加「媒体源」输入该地址即可拉流,VLC直接打开该网络地址即可播放 - 推流到YouTube、Facebook直播时,直接将FFmpeg的输出地址替换为平台提供的RTMP推流地址+你的专属流密钥即可,无需中转
方案3:Browser源对接(仅适配OBS,开发成本最低)
如果只需要接入OBS使用,可以用最低成本实现:
- 在Electron应用内启动一个轻量本地HTTP服务,端口自定义,提供一个仅渲染捕获流的静态页面,页面内将MediaStream绑定到
<video>标签设为全屏播放 - OBS添加「浏览器源」,输入本地服务地址(如
http://localhost:8888/stream),设置分辨率和你的捕获流参数匹配即可直接使用,不需要额外编码处理流数据
注意事项
- 低延迟场景优先选虚拟摄像头方案,端到端延迟可控制在200ms以内;直播场景优先选RTMP推流方案,兼容性最好
- 高分辨率高帧率场景下,可使用WebAssembly编码库处理帧数据,避免主进程卡顿
- 推流到公网平台时,可根据平台要求调整FFmpeg的编码参数(码率、关键帧间隔等)提升直播画质
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

