RTSP流网页播放实战:HLS/HTTP-FLV/WebRTC选型与部署指南

简介:针对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 reload

3.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,否则部分浏览器会限制自动播放;用CSS object-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日志定位。

我自己的习惯是,每次新项目部署都会把这条压测流程完整跑一遍。这不是玄学,是多年项目里被“白天测都好,晚上突然断流”这种事教育出来的。所以我现在每做完一条链路,第一件事就是验证稳定性,第二件事是确认延迟可接受,第三件事才是交付给客户。希望这套路径能帮你少走弯路。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

上一篇: Windows Insider渠道切换原理与注册表操作指南
下一篇: 软件开发流程八步详解:从需求分析到运维迭代
weixin_34059951
博客等级 码龄11年 3835粉丝 1229原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值