保姆级教程:手把手教你用FFmpeg-WebRTC和SRS 5.0+在Ubuntu上实现WebRTC推流
从零构建WebRTC流媒体系统FFmpeg-WebRTC与SRS 5.0实战指南流媒体技术正在重塑实时交互的边界而WebRTC作为现代浏览器原生支持的实时通信协议已经成为低延迟直播的首选方案。本文将带你从零开始在Ubuntu 22.10系统上搭建完整的WebRTC推拉流环境使用FFmpeg-WebRTC作为推流工具配合SRS 5.0流媒体服务器实现端到端的WHIP协议推流解决方案。1. 环境准备与依赖安装Ubuntu 22.10作为较新的LTS版本提供了稳定的开发环境基础。我们需要先配置必要的编译工具和依赖库sudo apt update sudo apt install -y build-essential checkinstall zlib1g-dev git cmake nasm yasm pkg-config关键依赖说明OpenSSL 3.0.7WebRTC加密通信的基础libx264H.264视频编码核心libopus高效的音频编解码器安装这些依赖时Ubuntu仓库中的版本可能不满足要求我们需要从源码编译# 安装Opus音频编解码库 sudo apt-get install -y libopus-dev # 编译安装x264 wget http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20220601-2245-stable.tar.bz2 tar -xvjf x264-snapshot-20220601-2245-stable.tar.bz2 cd x264-snapshot-20220601-2245-stable ./configure --enable-shared --enable-static make -j$(nproc) sudo make install提示编译x264时建议启用shared和static两种库类型确保FFmpeg能够正确链接。2. FFmpeg-WebRTC编译与配置FFmpeg-WebRTC是标准FFmpeg的分支版本增加了对WebRTC协议的原生支持。我们需要从源码编译这个特殊版本git clone https://github.com/ossrs/ffmpeg-webrtc.git cd ffmpeg-webrtc配置编译选项时需要特别注意启用WHIP协议支持./configure \ --enable-muxerwhip \ --enable-openssl \ --enable-version3 \ --enable-libx264 \ --enable-gpl \ --enable-libopus \ --extra-ldflags-L/usr/local/lib \ --extra-cflags-I/usr/local/include编译过程中常见问题及解决方案OpenSSL链接错误sudo cp /usr/lib/x86_64-linux-gnu/pkgconfig/*ssl* /usr/lib/pkgconfig/ sudo ldconfigx264找不到问题 确保pkg-config能够找到x264.pc文件可以手动指定路径export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH编译完成后验证WHIP支持./ffmpeg_g -muxers | grep whip应该能看到whipmuxer已启用。3. SRS 5.0服务器部署SRS(Simple Realtime Server)是一款高效的流媒体服务器5.0版本后对WebRTC支持有了显著提升。我们使用最新版本来构建服务端git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure --with-ffmpeg --with-ssl --with-h265 --with-nginx make -j$(nproc)注意SRS 6.0版本对WebRTC支持更完善但配置方式略有不同。本文以5.0.153版本为例。启动SRS的WebRTC服务./objs/srs -c conf/https.rtc.conf关键配置文件conf/https.rtc.conf的主要参数说明rtc_server { enabled on; listen 8000; # UDP端口 candidate $CANDIDATE; # 本机IP } http_server { listen 8080; dir ./objs/nginx/html; } rtc { rtc_to_rtmp off; rtmp_to_rtc off; rtc_to_rtmp off; }4. WHIP协议推流实战WHIP(WebRTC HTTP Ingestion Protocol)是新兴的WebRTC推流标准协议。我们使用编译好的FFmpeg-WebRTC进行推流测试./ffmpeg_g -re -i input.mp4 \ -vcodec libx264 -profile:v baseline -preset ultrafast \ -r 25 -g 50 -b:v 1500k \ -acodec libopus -ar 48000 -ac 2 -b:a 128k \ -f whip http://localhost:1985/rtc/v1/whip/?applivestreamlivestream参数解析参数说明推荐值-profile:vH.264配置级别baseline(兼容性最好)-preset编码速度/质量权衡ultrafast(低延迟)-gGOP大小帧率的2倍-ar音频采样率48000(WebRTC标准)-ac音频通道数2(立体声)常见推流问题排查只含视频不含音频WebRTC要求必须同时包含音视频轨道像素格式不支持使用-pix_fmt yuv420p确保兼容性编码参数不匹配必须使用baseline profile和opus编码5. 网页端拉流与监控SRS内置了WebRTC播放器页面我们可以直接使用http://localhost:8080/players/whep.html?autostarttruestreamlivestream对于生产环境你可能需要实现更完善的播放器。以下是基于JavaScript的WHIP播放器核心代码const peerConnection new RTCPeerConnection({ iceServers: [{ urls: stun:localhost:8000 }] }); peerConnection.ontrack (event) { if (event.track.kind video) { videoElement.srcObject event.streams[0]; } }; async function playStream() { const response await fetch( http://localhost:1985/rtc/v1/whep/?applivestreamlivestream, { method: POST, headers: { Content-Type: application/sdp } } ); const answer await response.text(); await peerConnection.setRemoteDescription( new RTCSessionDescription({ type: answer, sdp: answer }) ); }6. 高级配置与优化6.1 SDP交互分析WebRTC的核心是SDP(Session Description Protocol)交换。通过分析FFmpeg的日志我们可以了解协商过程[rtc 0x55816580bec0] WHIP: SDP offer1048B, answer1040B [rtc 0x55816580bec0] WHIP: ICE STUN ok, urludp://192.168.100.245:8000 [rtc 0x55816580bec0] WHIP: DTLS handshake done1 [rtc 0x55816580bec0] WHIP: SRTP setup done, suiteAES_CM_128_HMAC_SHA1_806.2 性能优化建议ICE候选策略配置正确的candidate参数减少连接时间缓冲区设置调整-bufsize和-maxrate参数平衡延迟与卡顿多线程编码使用-threads参数充分利用多核CPU6.3 防火墙与NAT穿越在真实网络环境中可能需要额外配置sudo ufw allow 8000/udp sudo ufw allow 1985/tcp sudo ufw allow 8080/tcp对于NAT环境需要在SRS配置中指定公网IPrtc_server { candidate 你的公网IP; }7. 实际应用场景扩展基于这套技术栈你可以构建多种实时应用超低延迟直播电商直播、在线教育等场景实时监控系统替代传统RTSP协议云端游戏串流利用WebRTC的低延迟特性远程协作工具实现浏览器间的实时音视频交互在测试过程中发现使用WHIP协议推流到SRS服务器端到端延迟可以控制在500ms以内远优于传统的RTMPHLS方案。对于需要互动性的场景这套方案提供了可靠的技术基础。