不使用WebRTC,基于FFmpeg实现直播流的替代方案及问题排查
基于FFmpeg的无WebRTC直播流方案及HTTP推流播放问题解决
一、除WebRTC外的FFmpeg直播流替代方案
- HTTP-FLV/RTMP:FLV格式适配浏览器(需借助flv.js),延迟远低于HLS,FFmpeg可直接推FLV流到HTTP服务,或通过RTMP服务器中转,浏览器通过JS库拉流播放,适合低延迟场景。
- MPEG-DASH:基于HTTP的自适应比特率流,延迟表现优于HLS,支持多码率适配不同网络环境。FFmpeg可生成DASH分片文件与MPD描述文件,浏览器通过dash.js实现播放。
- 优化版HLS:若此前HLS存在延迟高、绿块问题,可调整分片参数(如设置
hls_time 1将分片缩至1秒)、缩短GOP长度(强制关键帧间隔),同时优化编码参数,能有效改善体验。
二、当前HTTP GET推流无法播放的原因及解决
问题根源
你使用的video/mp2t(裸MPEG-TS流)无法被浏览器原生<video>标签解析——浏览器没有内置裸TS流的解码器,因此即便能接收数据,也无法正常播放,而FFmpeg本身具备完整的TS解码能力,所以能正常生成可播放的MP4文件。
解决办法
1. 切换为FLV格式(推荐)
修改FFmpeg输出格式为FLV,配合flv.js实现浏览器播放:
- 调整FFmpeg参数,将
-f mpegts替换为-f flv:-loglevel error -f avfoundation -framerate 5 -capture_cursor 1 -capture_mouse_clicks 1 -i 1 -c:v libx264 -pix_fmt yuv420p -vf pad='ceil(iw/2)*2:ceil(ih/2)*2' -threads 0 -preset veryfast -bf 2 -f flv pipe:1 - 更新Go处理器的Content-Type:
rw.Header().Set("Content-Type", "video/x-flv") - 客户端引入flv.js实现播放:
<video id="video" muted controls></video> <script src="flv.min.js"></script> <script> if (flvjs.isSupported()) { const videoElement = document.getElementById('video'); const flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://localhost:8080/stream' }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play(); } </script>
2. 若坚持使用TS流
可在Go服务端将TS流封装为HLS(自动生成m3u8索引文件与分片),或客户端使用mpegts.js库解析裸TS流,但实现复杂度高于FLV方案。
3. 补充优化点
- 强制关键帧生成:在FFmpeg参数中添加
-force_key_frames expr:gte(t,n_forced*1),确保每1秒生成一个关键帧,让浏览器能快速获取初始化播放所需的关键帧。 - 取消单连接限制:你的Go代码中
atomic.Bool的CAS逻辑会限制仅一个客户端连接,直播场景需改为广播机制(如将FFmpeg输出流复制给多个请求连接)。
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

