下面我将为你详细解释如何在网页上实现 RTMP 播放,并提供多种方案,从简单到专业。

核心概念:为什么不能直接播放?
你需要理解一个关键点:现代浏览器(如 Chrome, Firefox, Edge)原生不支持直接播放 RTMP 流。
这是因为:
- 插件时代终结:RTMP 播放通常依赖 Flash Player,而 Adobe 已经在 2025 年正式停止支持并禁用了 Flash。
- 安全与性能:浏览器厂商倾向于使用开放、标准化的视频格式(如 MP4, WebM)和流媒体协议(如 HLS, DASH),这些协议不依赖外部插件,更安全、性能也更好。
要在网页上播放 RTMP,我们必须使用一个“桥梁”或“转码器”,这个桥梁的作用是: 将 RTMP 流转换成浏览器可以理解的格式(通常是 HLS),然后再推送给网页播放器。
使用第三方服务(最简单,推荐新手)
这是最简单、最省心的方法,你只需要将你的 RTMP 推流地址推送到第三方服务,它会自动为你转码并提供一个 HLS (m3u8) 播放地址,你只需要在网页上播放这个 HLS 地址即可。

代表服务:
- Ant Media Server:功能强大的开源/商业媒体服务器,提供 RTMP 到 HLS 的实时转码。
- Wowza Streaming Engine:行业领先的商业媒体服务器,功能全面。
- Nimble Streamer:高性能的商业媒体服务器。
- 一些云直播平台:如阿里云直播、腾讯云直播等,它们也提供 RTMP 推流和 HLS 拉流的功能。
工作流程:
- 配置服务:在你的服务器(或云平台)上配置一个 RTMP 推流地址(
rtmp://your-server/live)和一个 HLS 播放地址(http://your-server/live/stream.m3u8)。 - 推流:使用 OBS、FFmpeg 等工具,将你的摄像头或视频文件推送到 RTMP 地址。
- 播放:在网页上,你不再使用 RTMP 地址,而是使用 HLS (m3u8) 地址,配合支持 HLS 的播放器(如 Video.js, hls.js)进行播放。
优点:
- 简单:无需关心复杂的转码和流媒体协议细节。
- 稳定:专业服务经过充分测试,稳定性高。
- 功能丰富:通常包含录制、截图、CDN分发等高级功能。
缺点:

- 成本:商业服务通常按带宽或并发数收费,即使是开源的自建版本也需要服务器资源。
- 依赖第三方:你的直播流依赖于第三方服务的可用性。
自建媒体服务器(最专业,最灵活)
如果你对性能、成本和数据隐私有更高要求,可以自己搭建一个媒体服务器,服务器负责接收 RTMP 流,然后实时转码成 HLS 流供前端播放。
常用开源软件:
- Nginx with nginx-rtmp-module:这是最经典、最广泛使用的组合,Nginx 是一个高性能的 Web 服务器和反向代理,
nginx-rtmp-module为它增加了 RTMP 协议的支持。 - SRS (Simple RTMP Server):一个功能强大的开源流媒体服务器,专注于 RTMP/HLS/WebRTC,性能优异,文档清晰,国内社区活跃。
- Ant Media Server:除了作为第三方服务,它也可以自部署在你的服务器上。
以 Nginx + nginx-rtmp-module 为例的工作流程:
-
安装和配置:
- 从源码编译安装 Nginx,并添加
nginx-rtmp-module模块。 - 修改
nginx.conf配置文件,定义 RTMP 应用和 HLS 转码规则。
# 在 http 块之外配置 rtmp { server { listen 1935; # RTMP 默认端口 chunk_size 4096; application live { live on; record off; # 关键部分:将 RTMP 流转码为 HLS hls on; hls_path /tmp/hls; # HLS 片段存放路径 hls_fragment 3s; # 每个片段的时长 hls_playlist_length 60s; # 播放列表总时长 # 可选:转码为不同清晰度 # exec ffmpeg -i rtmp://localhost/live/$name -c:v libx264 -b:v 256k -c:a aac -f flv rtmp://localhost/live/low_$name; # exec ffmpeg -i rtmp://localhost/live/$name -c:v libx264 -b:v 512k -c:a aac -f flv rtmp://localhost/live/mid_$name; } } } # 在 http 块中配置一个 web 服务器来提供 HLS 文件 http { server { listen 80; location /hls { # 将 /hls 请求映射到 HLS 片段存放路径 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; } } } - 从源码编译安装 Nginx,并添加
-
启动 Nginx。
-
推流:使用 OBS 推流到
rtmp://your-server-ip/live/mystream。 -
播放:Nginx 会在
/tmp/hls目录下生成mystream.m3u8文件,你的网页播放器就可以通过http://your-server-ip/hls/mystream.m3u8来播放了。
优点:
- 完全控制:服务器配置、性能、数据都在自己掌控之中。
- 成本效益:长期来看,自建可能比使用商业服务更便宜(尤其是流量大时)。
- 高度定制:可以根据需求进行深度定制和优化。
缺点:
- 复杂:需要服务器管理知识,部署和维护成本较高。
- 技术门槛:需要处理流媒体、网络、编码等技术问题。
纯前端方案(不推荐,仅用于特定场景)
理论上,存在一些纯 JavaScript 的 RTMP 客户端库,它们尝试在浏览器中直接解析和播放 RTMP 流。
代表库:
- jwplayer-rtmp:JWPlayer 的一个插件。
- videojs-flash:Video.js 的 Flash 回退插件(已过时)。
- flv.js:主要播放 FLV 格式,但可以通过一些技巧与 RTMP 配合(服务器将 RTMP 封装成 FLV over WebSocket)。
为什么不推荐?
- 依赖 Flash:绝大多数方案最终还是需要 Flash,而 Flash 已被淘汰,在最新浏览器中无法工作。
- 性能差:纯 JS 解码视频流对浏览器性能压力巨大,容易导致页面卡顿甚至崩溃。
- 兼容性差:不同浏览器支持情况不一,难以稳定运行。
- 延迟高:无法实现 RTMP 标称的低延迟。
除非你有非常特殊且可控的内部环境,否则强烈不建议使用纯前端方案。“RTMP -> 服务器转码 HLS -> 前端播放 HLS” 是目前唯一可靠且通用的方案。
前端播放器实现(以 HLS 为例)
一旦你通过上述任一方案获得了 HLS (m3u8) 播放地址,前端实现就非常标准了,这里以最流行的 Video.js 和 hls.js 为例。
准备工作
你需要在 HTML 中引入 Video.js 和 hls.js 的库。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">RTMP Stream Player</title>
<!-- 引入 Video.js CSS -->
<link href="https://vjs.zencdn.net/8.6.1/video-js.css" rel="stylesheet">
<style>
body { background-color: #333; color: #fff; text-align: center; padding-top: 50px; }
/* 确保视频播放器填满容器 */
.video-js { width: 800px; height: 450px; margin: 0 auto; }
</style>
</head>
<body>
<h1>Web Player for RTMP Stream</h1>
<!-- video-js 标签,id 和 class 必须有 -->
<video
id="my-player"
class="video-js vjs-default-skin"
controls
preload="auto"
width="800"
height="450"
>
<!-- 默认提示信息 -->
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="https://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>.
</p>
</video>
<!-- 引入 Video.js 核心 -->
<script src="https://vjs.zencdn.net/8.6.1/video.min.js"></script>
<!-- 引入 hls.js 插件 -->
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<!-- 引入 Video.js 的 hlsjs 插件 -->
<script src="https://vjs.zencdn.net/8.6.1/videojs-contrib-hls.min.js"></script>
<script>
// 你的 HLS 播放地址 (替换成你自己的)
// 这个地址是通过方案一或方案二得到的
const videoUrl = 'http://your-server-ip/hls/mystream.m3u8';
// 初始化 Video.js 播放器
const player = videojs('my-player', {
// 可以在这里配置播放器选项
fluid: true, // 自适应容器大小
muted: false,
language: 'zh-CN'
});
// 加载视频源
player.src({
src: videoUrl,
type: 'application/x-mpegURL' // HLS 类型
});
// 监听播放器事件
player.on('ready', function() {
console.log('Player is ready!');
});
player.on('error', function() {
console.error('播放器发生错误:', player.error());
});
</script>
</body>
</html>
代码解释
- HTML:创建一个
<video>标签,并给它一个id和class="video-js",这是 Video.js 挂载的目标。 - CSS:引入 Video.js 的样式,并可以自定义播放器样式。
- JavaScript:
- 引入
video.js、hls.js和videojs-contrib-hls三个脚本。videojs-contrib-hls是一个插件,它让 Video.js 知道如何处理 HLS 流,其内部就是使用了hls.js。 videojs('my-player', ...)初始化播放器。player.src({ src: videoUrl, type: 'application/x-mpegURL' })是最关键的一步,它告诉播放器去加载哪个地址,并指定了这是一个 HLS 流。- 后续可以监听
ready、error等事件来处理播放器的状态。
- 引入
总结与建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 第三方服务 | 简单、快速、稳定 | 有成本、依赖第三方 | 个人项目、中小型企业、快速原型验证 |
| 自建服务器 | 完全控制、成本低、灵活 | 复杂、技术门槛高 | 大型企业、对性能/隐私有高要求、长期运营的项目 |
| 纯前端方案 | 无需后端 | 不推荐、性能差、依赖Flash | 几乎不适用 |
给你的建议:
- 如果你是新手或只是想快速实现一个功能:直接选择 方案一(第三方服务),这是最快、最省心的方式,能让你专注于业务逻辑。
- 如果你是开发者,项目有一定规模,且希望长期可控:投入时间学习并部署 方案二(自建服务器),Nginx + SRS 都是很好的选择,一次投入,长期受益。
- 永远不要使用方案三,除非你明确知道你在做什么,并且接受其所有缺点。
无论你选择哪种后端方案,前端播放 HLS (m3u8) 流是标准且统一的实践。
