You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:56:09