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

使用Caddy反向代理MediaMTX的WebRTC端点遇类型错误问题

解决WebRTC代理的application/x-unknown-filetype错误

核心问题原因

  1. WebRTC需要同时处理HTTP信令请求和UDP/TCP媒体流,默认Caddy的HTTP反向代理仅支持HTTP请求转发,无法处理UDP媒体流,导致WebRTC建联失败,返回未知文件类型错误。
  2. handle_path /relay/*会自动剥离路径前缀,可能导致MediaMTX接收到的请求路径与预期不符(比如请求/relay/cam1会被转成/cam1传递给后端)。

方案1:用Caddy L4层代理支持WebRTC全流量

需安装caddy-l4插件实现四层(UDP/TCP)流量转发,兼顾HTTP信令和媒体流:

  1. 编译带L4插件的Caddy:
xcaddy build --with github.com/mholt/caddy-l4
  1. 修改Caddyfile配置:
{
    servers {
        protocol {
            experimental_http3
        }
    }
}

# 四层代理处理WebRTC的UDP/TCP媒体流
:443 {
    l4 {
        @webrtc_udp {
            protocol udp
            dst_port 443
        }
        forward @webrtc_udp :8889

        @webrtc_tcp {
            protocol tcp
            dst_port 443
            path /relay/*
        }
        forward @webrtc_tcp :8889
    }
}

# HTTP反向代理处理信令
my-server.com {
    handle_path /relay/* {
        @denied not remote_ip forwarded private_ranges
        abort @denied

        # 保留完整请求路径传递给MediaMTX
        reverse_proxy :8889 {
            uri preserve_path
        }
        # 强制设置WebRTC信令的MIME类型
        header Content-Type "application/json; charset=utf-8"
    }
}

方案2:改用HLS流(无需四层代理,更简单)

如果对延迟要求不高,HLS是更兼容的替代方案:

  1. 修改MediaMTX配置文件(mediamtx.yml)开启HLS输出:
paths:
  all:
    source: rtsp://你的RTSP流地址
    hls:
      enable: true
      address: :8889
  1. 调整Caddy配置:
my-server.com {
    handle_path /relay/* {
        @denied not remote_ip forwarded private_ranges
        abort @denied

        reverse_proxy :8889 {
            uri preserve_path
        }
        # 设置HLS的MIME类型
        header Content-Type "application/vnd.apple.mpegurl"
        header Access-Control-Allow-Origin "*"
    }
}
  1. 前端用hls.js播放(兼容性更好):
<video id="player" controls width="800"></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
const video = document.getElementById('player');
if (Hls.isSupported()) {
  const hls = new Hls();
  hls.loadSource(`https://my-server.com/relay/$cameraID/index.m3u8`);
  hls.attachMedia(video);
}
</script>

方案3:临时路径&MIME修复(仅排查用)

如果暂时不想折腾L4插件,先修复路径传递和MIME类型:

my-server.com {
    handle_path /relay/* {
        @denied not remote_ip forwarded private_ranges
        abort @denied

        reverse_proxy :8889 {
            uri preserve_path
        }
        header Content-Type "application/json"
    }
}

注意:这个只能解决HTTP信令的问题,WebRTC的UDP媒体流仍无法转发,最终还是会建联失败,仅用于排查路径是否是问题根源。

内容的提问来源于stack exchange,提问作者Abhijit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:34