如何从浏览器调用笔记本摄像头推RTMP流到AWS IVS?WebRTC转RTMP有无示例
方案总览
针对你提出的场景,有两个可行实现路径:要么绕开浏览器WebRTC直接从本地设备采集推送RTMP流,要么实现WebRTC到RTMP的协议转封装/转码。
方案1:直接采集笔记本摄像头推送RTMP
如果不需要基于浏览器实现业务,直接走本地采集推流路径成本更低:
- 零开发方案:直接用OBS等现成推流工具,选择本地摄像头作为输入源,填入AWS IVS提供的RTMP推流地址和流密钥即可直接推流
- 自研方案:可以基于FFmpeg、GStreamer等音视频处理框架,调用本地系统的摄像头采集接口,获取音视频数据后封装为RTMP流直接推送到IVS
方案2:WebRTC转RTMP流
该方案可实现,核心逻辑为:先通过WebRTC服务端接收浏览器推送的WebRTC流,提取音视频裸数据,如果编码不符合AWS IVS要求(IVS要求H.264视频+AAC音频)则先完成转码,再封装为RTMP格式推送到IVS。
基础实现参考(Node.js 简化示例)
以下示例基于mediasoup做WebRTC服务端收流,调用FFmpeg完成格式转换和RTMP推流:
const mediasoup = require('mediasoup'); const { spawn } = require('child_process'); // 1. 初始化mediasoup服务 let worker, router; async function initMediasoupServer() { worker = await mediasoup.createWorker(); router = await worker.createRouter({ mediaCodecs: [ { kind: 'video', mimeType: 'video/H264', clockRate: 90000, parameters: { 'packetization-mode': 1, 'profile-level-id': '42e01f', 'level-asymmetry-allowed': 1 } }, { kind: 'audio', mimeType: 'audio/opus', clockRate: 48000, channels: 2 } ] }); } // 2. 收到浏览器推的WebRTC流后,启动转推到IVS的逻辑 async function transcodeAndPushToIvs(producer, ivsRtmpEndpoint, ivsStreamKey) { // 创建RTP输出通道喂给FFmpeg const plainTransport = await router.createPlainTransport({ listenIp: { ip: '127.0.0.1' }, rtcpMux: false, comedia: true }); const consumer = await plainTransport.consume({ producerId: producer.id, rtpCapabilities: router.rtpCapabilities }); // 启动FFmpeg进程做格式转换+推流 const ffmpegProcess = spawn('ffmpeg', [ '-v', 'warn', '-protocol_whitelist', 'file,udp,rtp', '-f', 'sdp', '-i', '-', // 编码适配:如果输入已经是H264可直接copy,否则开启x264转码 '-c:v', 'libx264', '-crf', '23', '-preset', 'veryfast', '-c:a', 'aac', '-ar', '44100', '-f', 'flv', `${ivsRtmpEndpoint}/${ivsStreamKey}` ]); // 生成SDP配置传给FFmpeg const sdpContent = `v=0 o=- 0 0 IN IP4 127.0.0.1 s=WebRTC2RTMP c=IN IP4 127.0.0.1 t=0 0 m=video ${plainTransport.tuple.localPort} RTP/AVP ${consumer.rtpParameters.codecs[0].payloadType} a=rtpmap:${consumer.rtpParameters.codecs[0].payloadType} H264/90000 m=audio ${plainTransport.rtcpTuple.localPort} RTP/AVP 111 a=rtpmap:111 opus/48000/2 `; ffmpegProcess.stdin.write(sdpContent); ffmpegProcess.stdin.end(); // 输出FFmpeg日志排查问题 ffmpegProcess.stderr.on('data', data => console.log(`FFmpeg: ${data.toString()}`)); } // 初始化服务 initMediasoupServer();
注意:运行示例前需要提前在服务器安装FFmpeg,生产环境需要补充流状态监听、异常重启、转码参数调优逻辑。
内容的提问来源于stack exchange,提问作者robberson
相关产品推荐
相关产品推荐

