简介:针对RTSP流无法被主流浏览器直接播放的痛点,这份资源面向前端音视频开发者和有监控、直播及在线教育需求的工程师,提供一套基于Streamedian的网页播放实现参考,帮助快速打通RTSP到Web端的实时播放链路,尤其适合对低延迟与稳定性要求较高的Web监控、远程课堂等场景。包内共14个文件,包含Streamedian 2.1.5服务端组件、free.player与h265.player两套播放器JS库、HTML示例页面与CSS样式,以及配套的IntelliJ项目配置和H.265解码库,既能直接运行演示,也便于理解RTSP转HLS/WebRTC的完整过程。压缩包仅403KB,非常轻量,已有6846人学习。读者可从中获得可直接运行的播放demo、JS调用与控制逻辑、H.265兼容播放的参考实现,以及RTSP流前端化时的常见排错思路;无论搭建监控直播页面,还是学习RTSP与WebRTC协作机制,都能获得启发,适合二次开发或作为音视频入门的实用素材。
1. RTSP流网页播放:为什么安防项目总是卡在这道坎上
做过摄像头接入的人都知道,RTSP是安防领域的“通用语言”,海康、大华、宇视的枪机球机默认都吐RTSP流。但浏览器偏偏不认这个协议——你拿Chrome直接访问rtsp://开头的地址,只会得到一个无法处理的报错页面。于是“rtsp流视频实现网页播放”成了每个做监控平台、远程巡检、低延迟直播的团队绕不开的硬骨头。这事的本质不是协议有多难,而是“后端怎么拉流、前端怎么播放”这条链路要打通。
这篇文章从一个一线集成视角出发,把RTSP转网页播放的完整落地路径拆开讲:先用一张对比表说清HLS、HTTP-FLV、WebRTC三条主流路线的选型逻辑,再分别给出基于FFmpeg+nginx的中低延迟方案和基于ZLMediaKit的高并发低延迟方案,每个命令都能直接复制。最后用一整章写我踩过的坑——花屏、延迟递增、鉴权失效、多路并发断流,全是真实项目里的血泪经验。无论你是要用rtsp视频流播放工具快速验证,还是想搭一套能扛几十路并发的生产系统,这篇都按“先选型、再复现、后避坑”的顺序给你讲透。
2. 网页播放RTSP的三条路线:HLS、HTTP-FLV与WebRTC怎么选
2.1 为什么浏览器不能直接播放RTSP
先说底层原因。RTSP本身是控制协议,负责协商会话、控制播放暂停,真正的音视频数据走RTP包传输。RTP是UDP之上的实时传输,没有重传机制、没有拥塞控制,浏览器压根没有内置的RTP解复用器和对应的解码器管线。即便Chrome通过扩展或原生API拿到了RTP流,还要面对H.264/H.265的封装格式、PCM/Opus/AAC的音频格式匹配问题,这套链路在浏览器里没有标准化实现。
所以市面上所有“网页播放RTSP”的方案,本质都是转封装或转码。转封装是保留编码格式,只改传输协议和容器格式;转码是重新压一遍。转封装延迟低、CPU开销小,但要求浏览器能解码原编码格式;转码兼容性好,但延迟高、吃性能。选哪条路,先看你的编码格式是H.264还是H.265,再看延迟容忍度。
2.2 三条路线的性能与成本对比
| 方案 | 延迟 | 浏览器兼容性 | 并发能力 | 实现成本 | 适用场景 |
|---|---|---|---|---|---|
| RTSP转HLS | 5~15秒 | 极好,原生支持 | 高 | 低,FFmpeg+nginx即可 | 监控回放、对延迟不敏感的巡检 |
| RTSP转HTTP-FLV | 2~5秒 | 需flv.js,兼容IE9+ | 高 | 低,ZLMediaKit/SRS | 直播、实时监控、中低延迟场景 |
| RTSP转WebRTC | 200~800ms | 需WebRTC能力,现代浏览器均可 | 中高 | 高,需要Janus/mediasoup或商业方案 | 远程摇杆操作、AR/VR、对延迟极敏感的场景 |
HLS的优势是天然基于HTTP,能穿透绝大多数防火墙,而且iOS和Android的Safari/Chrome都原生支持video标签直接播放,不需要引入任何JS库。代价是切片延迟——通常3~6秒一个分片,加上缓冲,端到端延迟轻松到10秒以上。适合做回放,不适合做实时控制。
HTTP-FLV是中间路线。FLV容器本身很老,但好在flv.js可以在浏览器里用Media Source Extensions把FLV重新封装成fMP4喂给video标签。延迟可以压到3秒左右,兼容性也够用。这是目前做Web监控平台最常见的方案,ZLMediaKit和SRS都能把RTSP流拉进来再以HTTP-FLV分发,属于“用一个成熟服务代替自己写推拉流逻辑”。
WebRTC走的是UDP传输,有拥塞控制、丢包重传,延迟能做到500ms以内,是远程操作场景的唯一选择。但WebRTC网关搭建复杂——需要处理ICE/STUN/TURN、SDP协商、编码格式协商,工程量大。如果只有一两路流,用FFmpeg推流到Janus可能是最快的路径;如果要大规模接入,建议直接用商业方案。
2.3 决策树:按场景选择你的第一条路
我的经验是,先回答三个问题,再选路线。
第一,你的摄像头输出H.264还是H.265?如果是H.265,flv.js和大部分播放器都不支持硬解,只能软解,CPU占用直接起飞。这种情况要么让摄像头输出子码流(通常子码流是H.264低分辨率),要么接受转码成本。H.265的流优先考虑HLS配合Safari播放,或者用支持H.265的播放器(如EasyPlayer.js)走WebRTC。
第二,你对延迟的容忍度是多少?只是看画面、不需要控制,5秒延迟完全可以接受,走HLS最省事;要做云台控制和实时对话,延迟超过1秒就没法用了,只能走WebRTC。
第三,视频路的并发量级?10路以内,FFmpeg傻拉流勉强能跑;50路以上,必须上流媒体服务器做统一拉流和分发,否则每个播放端都要去直连摄像头,摄像头的RTSP连接数上限通常只有4~6路,很快就会被拉爆。
我一般给客户的建议是:先花半天用FFmpeg+nginx把HLS链路跑通,确认编码格式和网络拓扑没问题,再决定是继续用HLS还是升级到ZLMediaKit。大多数项目最终落在HTTP-FLV或WebRTC,但HLS是最便宜的验证工具。
3. 用FFmpeg+nginx搭一个最小可复现的RTSP转HLS链路
3.1 环境准备与FFmpeg版本要求
转HLS是成本最低的验证方案,也是排查摄像头RTSP问题最快的手段。你需要一台Linux服务器(Ubuntu 20.04以上即可)、一个编译了libx264和openssl的FFmpeg,以及nginx配合nginx-rtmp-module或直接用内置的hls模块。检查方法很简单:
ffmpeg -version | grep --color=never configure | sed 's/--enable/\n--enable/g' | grep -E "libx264|openssl"输出里能同时看到--enable-libx264和--enable-openssl,说明FFmpeg具备H.264编码和加密切片的能力。如果缺少libx264,直接用apt install ffmpeg得到的Ubuntu源版本通常已经包含,但要注意它不带HLS加密所需的openssl。没有openssl也不影响基础播放,只是没法做切片加密。
nginx这边建议直接用官方源安装。Ubuntu下:
sudo apt install nginx libnginx-mod-rtmp装完确认nginx能加载rtmp模块,运行nginx -V 2>&1 | grep rtmp,有输出就说明模块已就位。
3.2 从摄像头拉RTSP流的FFmpeg命令行
拿到摄像头的RTSP地址后,第一步不是直接推流,而是先用FFmpeg测试拉流是否正常。海康默认的主码流地址长得像这样:
rtsp://username:password@192.168.1.64:554/Streaming/Channels/101其中101是主码流,102是子码流。子码流分辨率低、码率低,适合做网页预览;主码流清晰但解码开销大。先用子码流跑通链路是稳妥策略。
ffmpeg -rtsp_transport tcp -i "rtsp://admin:password@192.168.1.64:554/Streaming/Channels/102" \ -c:v libx264 -preset veryfast -tune zerolatency -c:a aac -b:a 128k \ -f hls -hls_time 2 -hls_list_size 3 -hls_flags delete_segments+append_list \ /var/www/html/live/camera1.m3u8这条命令的逻辑:-rtsp_transport tcp强制用TCP传输,避免UDP在弱网下丢包导致的花屏和断流;-c:v libx264把摄像头可能输出的MJPEG或H.265统一重编码成H.264,保证浏览器能解码;-preset veryfast -tune zerolatency是低延迟编码的关键组合,前者减小编码耗时,后者消除编码器内部缓冲;-hls_time 2把切片设成2秒,-hls_list_size 3只保留最近的3个分片文件,防止磁盘被攒满;delete_segments+append_list让FFmpeg自动清理过期分片。
跑起来后,在服务器本地验证:
curl http://127.0.0.1:8080/live/camera1.m3u8返回内容应该是一串以#EXTM3U开头、包含多个#EXTINF:2.0行的文本,每一行后面跟着一个.ts分片文件名。
3.3 nginx配置HLS分发与跨域
FFmpeg分片写进/var/www/html/live/,nginx只需要把这个目录作为静态站点暴露出去。但如果你的前端页面在另一个域名上,必须处理跨域问题。最小配置如下:
server { listen 8080; server_name _; location /live/ { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias /var/www/html/live/; add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin *; } }types块告诉nginx两种文件对应的MIME类型,Access-Control-Allow-Origin *放行跨域请求。HLS分片是短生命周期文件,Cache-Control no-cache防止浏览器和nginx缓存旧分片。
然后重载nginx:
sudo nginx -t && sudo nginx -s reload3.4 前端播放:video标签加hls.js
如果只是验证,直接拿Safari打开http://服务器IP:8080/live/camera1.m3u8就能播放。Chrome和Firefox需要hls.js:
<video id="video" controls muted></video> <script src="https://cdn.jsdelivr.net/npm/hls.js@1"></script> <script> const video = document.getElementById('video'); if (Hls.isSupported()) { const hls = new Hls({ maxBufferLength: 10, liveSyncDurationCount: 3 }); hls.loadSource('http://your-server:8080/live/camera1.m3u8'); hls.attachMedia(video); video.play(); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { video.src = 'http://your-server:8080/live/camera1.m3u8'; } </script>maxBufferLength: 10限制缓冲区最大10秒,避免直播延迟越积越大;liveSyncDurationCount: 3让播放器尽量和直播源保持3个分片之内的同步。这两个参数是HLS低延迟体验的关键,不调的话浏览器默认策略会让延迟涨到几十秒。
跑通这条链路后,你就拥有了一个可用的RTSP测试地址验证工具:以后任何一路摄像头,只要FFmpeg能拉通并转出HLS,前端就一定能播。剩下的问题只有延迟和并发,这就引出下一章。
4. 生产级方案:ZLMediaKit做RTSP转HTTP-FLV与WebRTC
4.1 ZLMediaKit部署:Docker一行命令
HLS验证通过后,要上生产就得换流媒体服务器。ZLMediaKit是目前开源社区里对RTSP协议支持最完整、性能最好的方案之一,它内置了RTSP拉流、RTMP/FLV/WebRTC分发,还带一套简单的API用于鉴权和拉流控制。部署方式有两种:Docker和编译源码。
Docker最快,适合先跑通再研究源码:
docker run -d --name zlmediakit \ -p 1935:1935 -p 554:554 -p 8080:80 -p 443:443 \ -p 8554:8554 -p 10000:10000 \ -v /home/zlmediakit/data:/opt/media/bin/data \ zlmediakit/zlmediakit:master端口说明:554是RTSP服务端口,1935是RTMP,80是HTTP-FLV和API端口,8554是RTSP over HTTP的端口(部分网络环境需要),10000是WebRTC的UDP端口段起始。数据目录挂载到宿主机,方便查看录像和配置文件。
启动后访问http://服务器IP:8080/index能看到内置的网页播放器,这就是一个现成的rtsp视频流播放工具。
如果你要二次开发或定制编译,源码方式更合适:
git clone https://github.com/ZLMediaKit/ZLMediaKit.git cd ZLMediaKit mkdir build && cd build cmake .. make -j4编译前需要安装依赖libssl-dev和libsdl-dev,前者用于WebRTC和RTP加密,后者是测试工具依赖。编译产物在build/bin/MediaServer,直接运行即可。
4.2 通过API把RTSP流接入ZLMediaKit
ZLMediaKit采用“按需拉流”机制:你不需要像FFmpeg那样手动启动进程,而是在前端请求播放时,通过API让服务器去拉RTSP流并分发。这样做的好处是:多个播放端共享一路拉流,摄像头压力只受“是否存在观众”影响。
主动拉流用下面的API:
curl -X POST "http://127.0.0.1:8080/index/api/addStreamProxy" \ -H "Content-Type: application/json" \ -d '{ "vhost": "__defaultVhost__", "app": "live", "stream": "camera1", "url": "rtsp://admin:password@192.168.1.64:554/Streaming/Channels/102", "rtp_type": "tcp", "enable_hls": false, "enable_mp4": false, "enable_audio": true, "enable_rtsp": true, "enable_rtmp": true, "enable_http_flv": true, "enable_web_rtc": true }'app和stream定义了流的标识,前端播放地址就是http://服务器IP:8080/live/camera1.flv或webrtc://服务器IP/live/camera1。rtp_type强制TCP拉流,这个参数和FFmpeg里的-rtsp_transport tcp作用一样,但这里只要设一次,所有播放端都受益。enable_hls默认关掉,如果不需要HLS别开,省得生成无用分片。
这个API返回的key字段是这条流的唯一标识,后面停止拉流要用。查看所有在线流:
curl "http://127.0.0.1:8080/index/api/getMediaList"响应是一个JSON数组,每条流包含app、stream、vhost、aliveSecond等字段。aliveSecond表示这条流已经存活多少秒,如果一直不增长,说明摄像头掉线了或网络不通。
4.3 前端播放HTTP-FLV:flv.js参数调优
ZLMediaKit分发出来的FLV流,前端用flv.js播放。播放地址形式是http://服务器IP:8080/live/camera1.flv,类型是flv。示例:
<script src="https://cdn.jsdelivr.net/npm/flv.js@1"></script> <video id="video" controls muted></video> <script> const flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://your-server:8080/live/camera1.flv', isLive: true, cors: true }, { enableStashBuffer: false, stashInitialSize: 128, lazyLoadMaxDuration: 3, deferLoadAfterSourceOpen: false }); flvPlayer.attachMediaElement(document.getElementById('video')); flvPlayer.load(); flvPlayer.play(); </script>关键在enableStashBuffer: false。flv.js默认会缓冲几百KB的数据用于平滑播放,这对点播是好事,但直播场景下意味着延迟被缓冲区吃掉了。关掉后延迟能降到2秒左右,但网络抖动时更容易卡顿。lazyLoadMaxDuration控制懒加载最大时间,设成3秒可以让播放器在数据不够时不要无限等待。
一个容易忽略的点:isLive必须为true。否则flv.js会按点播模式工作,每次加载都从头读FLV文件,直播流没有文件头,直接导致无法播放或播放器永远卡在加载状态。
4.4 启用WebRTC播放:低延迟场景的配置
HTTP-FLV做到2秒已经是极限,如果要做云台控制就要WebRTC。ZLMediaKit的WebRTC不需要单独配置,只要确保enable_web_rtc开过、TCP和UDP端口可用,前端用webrtc://your-server/live/camera1作为地址即可。ZLMediaKit源码自带一个WebRTC播放器示例,但生产环境建议自己封装。最简单的方式是直接在视频标签前加一层选择逻辑:优先WebRTC,降级FLV。
const webrtcUrl = `webrtc://${host}/live/${streamId}`; const flvUrl = `http://${host}:8080/live/${streamId}.flv`; async function play() { const url = await tryWebRTC(webrtcUrl) ? webrtcUrl : flvUrl; if (url.startsWith('webrtc')) { // 使用支持WebRTC的播放器,例如ZLMediaKit自带的webrtc_player.js } else { // 使用flv.js } }WebRTC的延迟能做到300~500ms,但代价是播放器实现复杂度上了一个台阶。FLV播放器是纯JS,几百行代码搞定;WebRTC播放器要处理ICE协商、DTLS加密、SRTP解包,没有现成库的话工作量翻倍都不止。我的一般策略是:先把HLS和FLV两条链路跑稳定,WebRTC作为后续优化项,不要一上来就啃硬骨头。
5. 常见问题避坑:RTSP拉流播放的5个血泪经验
5.1 花屏和画面撕裂:UDP传输导致丢包
现象:用默认配置拉流,画面时不时出现绿色色块、马赛克,严重时直接黑屏。过两秒又恢复,但马上又花。
原因:RTSP默认走UDP传输RTP包,UDP不重传丢包。摄像头码率高、交换机转发能力不足或WiFi网络不稳定时,丢包率上升,H.264的I帧部分丢失就会导致后续P帧解码失败,表现就是花屏。
解决:在拉流端强制TCP。FFmpeg加-rtsp_transport tcp,ZLMediaKit的addStreamProxy接口设"rtp_type": "tcp"。这个改动一分钱不花,但能解决90%的花屏问题。如果强制TCP后花屏仍然存在,用ffprobe看码流的SPS/PPS信息是否完整:
ffprobe -rtsp_transport tcp -show_streams "rtsp://user:pass@ip:554/..." 2>&1 | grep -E "width|height|codec_name"输出里codec_name=h264且width/height和摄像头实际分辨率一致,说明码流结构正常;如果width=0或height=0,说明RTSP协商出了问题,通常是摄像头端的SDP信息不完整,需要升级摄像头固件或换一个RTSP端口。
5.2 延迟越拉越大:播放器缓冲区吞噬时间
现象:刚播放时延迟3秒,看了10分钟后延迟变成30秒,刷新页面恢复,过一会又涨。
原因:播放器为了平滑播放,会不断往缓冲区里塞数据。直播源持续产生新数据,播放器解码速度追不上源端速度,缓冲区越积越厚。HLS的m3u8列表里有多个分片,播放器默认会缓冲好几个分片才开播,这是延迟膨胀的重灾区。
解决:控制两端。后端把hls_time从默认6秒降到2秒,hls_list_size从5降到3,减少切片和列表长度;前端把hls.js的maxBufferLength调到10秒以下,flv.js把enableStashBuffer设为false。还有一个冷门技巧:定期自动刷新播放器,每小时重载一次页面,把累积的延迟清零。做监控平台时,我通常会在前端写一个定时检测逻辑:当video.buffered.end(0) - video.currentTime > 15时,主动把currentTime跳到buffered.end(0) - 5,强制追赶直播源。
5.3 多路并发时摄像头断流:RTSP连接数上限
现象:10个用户同时观看同一路摄像头,看了几分钟后摄像头掉线,重启摄像头或等一会才能恢复。
原因:大部分安防摄像头对RTSP并发连接数有硬限制,海康一般允许4~6路,大华可能更少。早期方案如果不做流媒体服务器,直接用VLC或前端播放器直连摄像头RTSP地址,每一路播放都占用一个连接,超过上限摄像头直接拒绝新连接甚至崩溃。
解决:这是必须上流媒体服务器的典型场景。用ZLMediaKit或SRS做统一入口,服务器只保持一个到摄像头的长连接,多个用户从服务器拉流。ZLMediaKit的addStreamProxy本身就是按需拉流——第一个用户请求时建立连接,最后一个用户断开后关闭连接。这样无论多少播放端,摄像头永远只面对流媒体服务器一个RTSP客户端。另外注意摄像机设置里的“子码流”参数,把子码流的码率上限调低,减少拉流端的解码压力。
5.4 FLV播放器无法启动:跨域与MIME类型
现象:前端页面在http://192.168.1.10:3000,流服务器在http://192.168.1.20:8080,flv.js报Failed to fetch或Could not open错误。
原因:两个不同源的地址之间发HTTP请求,被CORS策略拦截。ZLMediaKit默认允许跨域吗?默认不。需要检查服务配置,在config.ini里找到[http]段的allow_cross_domains,设为1。如果是自己用nginx做反向代理,必须在代理配置里加:
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers *;还有一个隐蔽坑:nginx代理FLV分发时,默认会缓冲整个响应体再发给客户端,直播流没有结束标志,导致前端永远收不到数据。必须关掉缓冲:
proxy_buffering off;这行配置加不加,是FLV播放能通和不能通的分水岭。同理,HLS分片是短文件,不用担心缓冲问题,但FLV是长连接流,必须关闭代理缓冲。
5.5 音频无声或音画不同步:音频编码格式的坑
现象:视频正常播放,但没有声音;或者声音正常,画面对不上口型。
原因:摄像头输出的音频编码格式五花八门。海康新固件默认是AAC,老固件可能是G.711;大华部分型号输出Opus或G.726。浏览器能解码AAC、Opus、MP3,但G.711老编码在Chrome里没有实现,直接导致无声。音画不同步则是音频和视频两个RTP流的时钟基准不一致,转封装时没有对齐时间戳。
解决:转码时强制统一音频编码。FFmpeg加-c:a aac并指定-b:a 128k,把任何输入音频转成AAC。ZLMediaKit的addStreamProxy里设"enable_audio": true,并确保rtp_type和protocol配置正确,服务器会自动做音频转码。检查当前流的音频信息:
curl "http://127.0.0.1:8080/index/api/getMediaList" | python3 -m json.tool | grep -E "audio_codec|video_codec|app|stream"audio_codec字段显示aac则正常,显示pcma或pcmu就要准备转码。另外,如果摄像头音频采样率是8kHz,AAC编码后会出现严重的声音发闷、语速变慢问题,建议在FFmpeg命令里加-ar 44100重采样,同时-ac 1保证单声道。
6. 进阶技巧:把延时从秒级压到毫秒级与多路一屏
6.1 一套完整的低延迟参数模板
如果你的项目是远程控制或弱网环境,参考下面这套参数组合。FFmpeg转WebRTC推流时:
ffmpeg -rtsp_transport tcp -i "rtsp://..." \ -fflags nobuffer -flags low_delay \ -c:v libx264 -preset ultrafast -tune zerolatency \ -g 30 -keyint_min 30 -sc_threshold 0 \ -c:a aac -ar 44100 -ac 1 \ -f mpegts "udp://127.0.0.1:5000?pkt_size=1316"-fflags nobuffer和-flags low_delay是FFmpeg层面消除缓冲的两个开关;-g 30强制每30帧一个关键帧,确保播放器快速起播;-sc_threshold 0禁用场景切换检测,避免编码器在画面剧烈变化时插入额外关键帧打乱节奏。这套参数配合ZLMediaKit的WebRTC播放,局域网环境下延迟能稳定在300ms左右。
6.2 多路同屏的实现方式与性能边界
多路摄像头同屏是监控平台的刚需。最简单的实现是每个播放器实例开一个video标签,但十几路视频同时解码会让CPU直接拉满。常见做法是使用MSE合并多路流到一个video标签,或者用WebCodecs做自定义解码渲染。
ZLMediaKit配合Canvas方案是折中路径:为每路流创建一个离屏video元素播放,通过requestVideoFrameCallback或定时器把画面绘制到Canvas的固定区域。这个方案的单路解码开销与直接播放一致,但画面布局灵活,可以任意拼接和缩放。具体实现要点:把video元素的muted设为true,否则部分浏览器会限制自动播放;用CSSobject-fit: cover裁剪画面,避免拉伸变形。
多路同屏的性能边界取决于浏览器解码能力。H.264的1080p中等复杂度,Chrome软解一路大约占10%~15%的CPU核心。四路同屏建议用子码流(分辨率降到720p或更低),八路以上必须依赖硬解。判断是否是硬解,Chrome地址栏输入chrome://media-internals,查看Decoder Name字段,如果显示VDAVideoDecoder说明启用了硬解,显示FFmpegVideoDecoder就是软解。
6.3 验证与压测:用ffprobe和脚本确认链路质量
链路搭好后,别急着收工。用ffprobe做一次深度的码流验证:
ffprobe -v error -show_entries stream=index,codec_name,codec_type,width,height,avg_frame_rate -of csv "http://server:8080/live/camera1.flv"输出应该类似1,h264,video,1920,1080,25/1和2,aac,audio,0,0,0/0。确认视频编码是h264而不是hevc,帧率匹配摄像头设置。然后做持续稳定性测试,写一个简单的循环脚本,每隔5分钟用curl探测FLV流是否可连接:
for i in $(seq 1 100); do code=$(curl -s -o /dev/null -w "%{http_code}" "http://server:8080/live/camera1.flv" --max-time 5) echo "$(date) - HTTP $code" sleep 300 done如果出现非200状态码,说明流服务器在某个时间点崩了或拉流失败,需要查看ZLMediaKit日志定位。
我自己的习惯是,每次新项目部署都会把这条压测流程完整跑一遍。这不是玄学,是多年项目里被“白天测都好,晚上突然断流”这种事教育出来的。所以我现在每做完一条链路,第一件事就是验证稳定性,第二件事是确认延迟可接受,第三件事才是交付给客户。希望这套路径能帮你少走弯路。
本文还有配套的精品资源,点击获取