
做流媒体开发这两年我最大的体会就是测试流地址比想象中难找。网上的公开RTSP源不是失效就是不稳定想验证播放器、测试拉流协议、调HLS延迟手头连个可控的流都没有那感觉真是寸步难行。我自己吃过几次亏之后干脆在本地和一台测试服务器上都搭了WOWZA专门用来生成RTSP、RTMP、HLS三路协议的标准测试流。这篇文章就记录一下完整的搭建过程、地址拼写规则、验证手段和实际踩过的坑希望能给同样被测试流困扰的朋友一点参考。1. WOWZA之前为什么你需要一套自建流媒体测试环境先说一个反直觉的结论越是想测试播放器、验证协议逻辑越不要依赖公网上的直播源。公网直播流存在三个问题第一是地址随时可能失效今天能播明天就404第二是不稳定网络抖动、源站限流都会让测试结果失真第三是码率、编码格式、分辨率和帧率完全不可控你没法针对特定场景做精确验证。本地自建WOWZA最直接的价值就是可控。你可以往服务器上放几段不同编码格式、不同码率的MP4文件然后通过WOWZA转换成统一的RTSP、RTMP、HLS输出。无论你是做前端播放器开发还是调试摄像头RTSP拉流还是评估HLS的延迟表现一套WOWZA测试环境就能把所有临时的、依赖外部的变量全部从测试链路里摘出去。WOWZA本身的架构也值得多说一句。它是一个Java写的流媒体服务器核心能力是把本地或推送上来的媒体流转发成多种协议。你不需要懂底层实现只需要理解它有一套基于Application应用的目录结构每个应用下面可以放媒体文件、配置播放规则然后通过不同的协议端口把流分发出去。默认安装后WOWZA会创建live、vod、reflector等几个预置应用其中live用于拉推流vod用于点播。严格来说WOWZA并不会自带现成的“测试流”它提供的是生成测试流的全部基础设施你需要往vod应用里放文件或者往live应用里推流。我用这套环境做过不少事小到一个播放器的倍速、跳转、起播时间测试大到整个视频监控平台的RTSP拉流压力验证都是靠WOWZA撑起来的。你如果只是偶尔需要个临时流地址做演示同样适用。2. 安装与源站配置把WOWZA跑起来的基本盘安装WOWZA不是高深的事但有些细节直接决定了后面所有测试流能不能正常工作。我建议把整个安装和基础配置过程分成三块来做服务器环境准备、安装激活、端口连通性检查。2.1 直到安装前都没人告诉你的环境要求WOWZA的安装包是基于Java的官方要求系统上有Java环境。注意这里的坑点是版本WOWZA官方对不同版本推荐的Java版本不完全一样常见的是OpenJDK 8或11。如果你服务器上已经装了其他Java版本建议单独给WOWZA设置JAVA_HOME环境变量不要让系统的多个Java环境打架。安装介质的话WOWZA有两个版本一个是免费试用版功能受限有连接数或时间限制另一个是正式版本。测试环境用试用版就够了但要注意试用版在激活后通常允许固定的连接数比如免费版限5个并发流。看起来小实际上足够本地调试和绝大多数开发验证。如果你要模拟上百路并发拉流那就需要申请正式许可证了。还有一个非常容易被忽略的要求WOWZA的安装路径尽量不要包含中文和空格。Windows下默认装在C:\Program Files\WOWZA Media Server这个路径本身带空格实际用下来多数情况没事但我遇到过某些依赖原生库的版本对带空格路径处理得不好导致转封装时的临时文件写不进去。后来我一律改到D:\WOWZA这类纯英文短路径下相关诡异问题再没出现过。2.2 安装激活和后台的第一次登录安装包里有一个.exeWindows或.deb/.rpmLinux安装文件。Windows安装时一路下一步即可Linux下则要留意WOWZA安装脚本默认会把服务注册成自启动你在系统初始化阶段最好确认这一点免得服务器重启后WOWZA没有自动起来测试流全部失效。启动完成后浏览器访问http://服务器IP:8088进入管理控制台。如果你是远程服务器第一次打开页面的时候需要输入本机IP和端口这时候系统会提示你激活试用密钥。试用密钥不要填错格式WOWZA的LicenseKey是一串UUID格式的字符串复制粘贴的时候很容易把回车符带进去导致激活失败。这个问题我从同事那里听到过多次解决的唯一办法就是粘贴后仔细检查首尾有没有多余空格。安装和激活成功后不要急着传视频先把后台左侧的Server Status页面打开确认三大服务的状态都是绿色协议默认端口主要用途RTSP554拉流和推流用于摄像头、播放器等RTSP会话RTMP1935RTMP推流和拉流适合直播场景HTTP8086HLS分发、MP4点播的HTTP输出以及部分WebRTC功能依赖的入口HTTPS8087加密的HTTP输出HLS的HTTPS版本会用到管理控制台端口8088不承担媒体数据分发只是后台管理。这一步先不急着点任何播放器接着往下走配置。3. 用本地MP4生成VOD点播流最简单的出流方式WOWZA出测试流最快的方式不是搭建直播应用而是把MP4文件放到vod应用的存储目录下让WOWZA按需转封装。这个方法零推流依赖一个MP4文件就能同时生成RTSP、RTMP、HLS三种协议的测试地址。3.1 我的视频文件该放哪儿WOWZA安装目录下有个content文件夹具体路径取决于你的安装目录。在后台Applications页面找到vod应用左侧属性面板里能看到Storage目录的完整路径默认就是[WOWZA安装目录]/content。我强烈建议你不要在后台动态改这个路径先使用默认目录测试跑通了再迁移。把准备好的MP4文件直接复制到这个目录里。出于测试考虑文件命名不要用中文和特殊字符免得URL转义带来不必要的麻烦。我用过比较稳定的一组测试文件是这样的test_h264_aac_720p.mp4H.264编码 AAC音频时长约2分钟用于标准播放测试test_h265_4k.mp4H.265编码 AAC音频用于验证播放器对HEVC的兼容性test_noaudio.mp4纯视频轨用于验证播放器在没有音频流时的表现WOWZA对MP4的编码格式是有要求的封装进入MP4的编码建议是H.264/H.265加AAC如果遇到MPEG-2编码或者没有音频的MP4默认情况下可能出流失败。这一点在后面踩坑部分我会详说。3.2 刷新媒体信息并验证文件扫描文件放进去后VOD应用并不会实时扫描目录。后台切换到vod应用的Content页面点击Refresh Content按钮WOWZA会重新扫描存储目录把新加入的MP4文件登记到媒体列表里。列表里能看到文件名、时长、文件大小这些元数据。如果文件编码不符合要求列表里可能显示媒体不可用甚至直接不出现。遇到这种情况不要反复刷先确认编码格式再确认文件是否有损坏。这一步做完WOWZA侧已经具备出流能力了剩下的关键就是地址怎么拼。4. 让推流端和播放端都满意三种测试地址的拼写规则很多人在这一步卡住其实WOWZA的地址规则并不复杂只是不同协议拼写方式不一样容易记混。我直接给出一套最通用、最稳的地址模板。4.1 RTSP地址WOWZA把VOD应用的MP4文件转成RTSP流基本格式是rtsp://服务器IP:554/vod/mp4:文件名.mp4注意端口554可以省略但建议书写时保留便于排查问题。文件名的前缀是mp4:这是WOWZA的特殊约定作用是把文件名和路径结合起来告诉服务器去vod应用的媒体库里找哪个文件。如果你把MP4放进了一个子目录那么路径也要体现出来例如rtsp://192.168.1.100:554/vod/mp4:subdir/test.mp4RTSP地址适合VLC、ffplay、海康/大华播放器这类支持RTSP协议的播放端直接拉流。另外如果你使用的SDK对RTSP的路径解析比较严格就不要轻易省略mp4:这个前缀。4.2 RTMP地址RTMP地址和RTSP类似只是协议头换成rtmprtmp://192.168.1.100:1935/vod/mp4:test.mp4这个地址可以被支持RTMP的播放器直接拉流。如果做直播通常你会推到live应用而不是vod应用但测试时直接用VOD文件的RTMP地址来验证播放端拉流也很方便。注意RTMP默认端口是1935和RTSP的554不能混。4.3 HLS地址HLS地址跟前面两个完全不同它不是以视频文件直接作为流地址而是指向一个m3u8索引文件。WOWZA生成的HLS地址格式是http://192.168.1.100:8086/vod/mp4:test.mp4/playlist.m3u8关键点是playlist.m3u8这个尾部。如果你把这个地址在浏览器里直接打开看到的是一段m3u8文本内容是若干TS分片文件的地址。这正是HLS协议的特点它把长视频切成很多小块播放器逐个请求分片从而实现边下边播。HLS地址在浏览器里可以直接用hls.js播放在VLC里也能直接打开。需要留意的是HLS的默认端口是8086而不是8088很多人习惯性填8088结果一直拉不出索引文件我猜这个坑是最常见的。4.4 一表对照三种地址协议默认端口地址示例适用场景RTSP554rtsp://192.168.1.100:554/vod/mp4:test.mp4摄像头、网络播放器、ffmpeg拉流RTMP1935rtmp://192.168.1.100:1935/vod/mp4:test.mp4直播SDK、OBS推流后的拉流验证HLS8086http://192.168.1.100:8086/vod/mp4:test.mp4/playlist.m3u8网页播放器、iOS/Android端拿到这段表格测试流三个地址就已经齐了。接下来所有工作就是验证这地址是否真的能从外部拉通。5. 从浏览器到播放器的全链路验证打通三条测试流地址生成出来后别急着宣传成功验证是最重要的闭环。我给自己的流程是三层验证本地直接拉流、远程服务器拉流、命令行工具确认流信息。5.1 VLC拉流验证VLC是最通用的验证工具打开网络串流把RTSP地址粘贴进去如果能秒出画面说明WOWZA的RTSP协议通道已经通了。RTMP同样可以在VLC里验证HLS地址也一样。VLC验证过程中有一个小技巧如果一个地址半天不解析你可以把VLC的日志级别调成2来查看具体卡在哪一步。常见的情况包括DNS解析失败、TCP握手被重置、HTTP 404。VLC的日志输出能帮你快速判断请求是否到达了WOWZA的端口。5.2 用ffprobe检查流信息命令行下我更习惯用ffmpeg自带的ffprobeffprobe -rtsp_transport tcp -i rtsp://192.168.1.100:554/vod/mp4:test.mp4 -show_streams -show_format -of json这条命令会返回流的编码信息、分辨率、帧率、比特率等元数据。如果输出正常就说明拉流协议已经通数据封装的格式也都是正确的。RTMP和HLS验证同理把地址换掉即可。HLS地址用ffprobe检查时如果返回的streams里能看到视频轨和音频轨说明TS分片切割正常m3u8索引解析没有异常。5.3 用ffmpeg命令行完成拉流压力测试验证单路拉通还不够我会用ffmpeg拉流到本地文件来模拟一个完整的播放过程ffmpeg -rtsp_transport tcp -i rtsp://192.168.1.100:554/vod/mp4:test.mp4 -t 10 -c copy output.mp4这会把流的前10秒数据拷贝到本地文件如果文件能正常打开的话说明流不仅能拉到还能完整解码。如果你要模拟多路并发拉流可以写一个循环脚本同时启动多个ffmpeg进程分别拉取不同地址。不过免费试用版有并发连接数限制这一步要控制好并发数量不要拉太猛导致源站崩溃那属于压力测试范畴了。5.4 浏览器端HLS验证HLS在浏览器里有两种验证思路第一是用hls.js这类库去拉取第二是直接用原生video标签播放m3u8地址Safari支持。在Chrome里你可以直接打开m3u8地址但浏览器并不会自动播放TS通常会看到一个JSON格式的错误或者自动下载所以更稳妥的方式是打开一个简单的HTML页面用video标签绑定hls.js来拉流。video idvideo controls autoplay/video script srchttps://cdn.jsdelivr.net/npm/hls.jslatest/script script const video document.getElementById(video); if (Hls.isSupported()) { const hls new Hls(); hls.loadSource(http://192.168.1.100:8086/vod/mp4:test.mp4/playlist.m3u8); hls.attachMedia(video); } /script这里有个很重要的前提你的页面要能从服务器跨域拉取m3u8。WOWZA的HTTP分发默认是允许跨域访问的但如果源站做了防盗链或者跨域限制浏览器会报CORS错误。我在本地用localhost打开页面访问远程WOWZA时遇到过一次最后确认是WOWZA的Crossdomain.xml策略配置不对导致的。6. 实际踩坑明明配置对了地址为什么还黑屏流媒体环境向来是“配置看起来都对但就是不出流”的重灾区。我把自己踩过的一些坑集中整理一下这些经历绝大多数都是“看似玄学实际有因可循”的。6.1 防火墙和端口不通最大的坑永远是端口没开。WOWZA安装后操作系统的防火墙默认不会自动放行554、1935、8086这几个端口。你可以在WOWZA所在机器上用netstat -ano | findstr :554Windows或ss -lntp | grep 554Linux确认端口是否在监听然后再确认外部机器能否telnet通。最隐蔽的情况是云服务器安全组。有些云平台即使你本机防火墙放行了安全组没有放行对应的入方向规则外部访问一样被丢弃。我自己排查过几次结果都是安全组漏了1935或者554端口。解决方案是去云控制台把对应协议端口全部放行注意不要只放行TCP而漏掉UDP。RTSP默认走TCPRTMP基本也是TCP但RTSP的有些实现依赖UDP传输音视频数据为了保险起见TCP和UDP都放行。6.2 MP4的编码格式不兼容WOWZA对输入文件的编解码能力是有边界要求的。官方的支持列表很长但我建议测试文件老老实实用H.264AAC。如果你用的是带B帧的H.264理论上也支持但低延迟场景下B帧会增加转封装时间导致播放器起播变慢。HEVCH.265文件在WOWZA服务端也能被转成TS分片但很多老旧的RTSP播放器不支持H.265硬解播放黑屏。这类问题属于编码兼容性不是WOWZA地址错误。6.3 VOD应用路径和大小写WOWZA的URL路径是区分大小写的/VOD和/vod是两个完全不同的路径。我在Windows上遇到过因为手误把路径写成/Vod导致404的问题。Windows文件系统不区分大小写但WOWZA的应用路由是区分的。解决办法就是统一使用后台看到的应用名大小写不要凭感觉输入。6.4 HLS分片写不进磁盘HLS出流时WOWZA要把每一帧切割成TS分片并写到一个临时目录。如果磁盘空间满了或者临时目录权限不足就会出现m3u8能访问但分片404的情况。遇到这种情况查看日志通常会看到类似“Cannot write file”的错误。我的习惯是给content和临时目录各留至少几GB空间并定期清理没用的MP4和分片缓存。6.5 视频时间戳异常导致播放器起播失败这个坑比较隐蔽。我在测试的时候用过一段从网上下来的MP4VLC本地播放正常但在WOWZA里拉RTSP时播放器进度条一直转但不出画面。后来查了WOWZA日志发现是MP4文件的起始时间戳不是0导致转封装时出现负时间戳或者跳变。解决办法很简单用ffmpeg重新转一次封装ffmpeg -i source.mp4 -c copy -movflags faststart clean.mp4这样处理过的MP4文件在WOWZA里出流基本就稳定了。7. 进阶玩法从VOD点播到直播推流和多码率输出VOD点播是WOWZA最易上手的使用方式但在实际项目里你往往需要直播推流测试这时候就要开启live应用了。7.1 用OBS或ffmpeg推流到live应用live应用默认已经存在但也要确认它是不是处于运行状态。进入Applications页面live应用属性中有一个Enable项的配置确保勾选。之后用OBS推流的时候服务器填写rtmp://192.168.1.100:1935/live串流密钥填写一个自定义的流名比如test001。推流成功后对应的拉流地址就成为RTSPrtsp://192.168.1.100:554/live/test001RTMPrtmp://192.168.1.100:1935/live/test001HLShttp://192.168.1.100:8086/live/test001/playlist.m3u8用ffmpeg推流也很简单ffmpeg -re -i test.mp4 -c:v libx264 -c:a aac -f flv rtmp://192.168.1.100:1935/live/test001注意-re参数它让ffmpeg以实时的速度读取文件并推送如果不加这个参数推流速度会快于实际播放节奏导致观看端很快播放完。7.2 用SMIL文件实现多码率输出有时候你需要同一个内容输出不同清晰度的流地址方便测试播放器的自适应码率切换。WOWZA支持通过SMIL文件把多个码率整合成一个自适应码率流。做法是准备一个类似这样的XML文件smil body switch video srcmp4:test_1080p.mp4 system-bitrate2500000 width1920 height1080 / video srcmp4:test_720p.mp4 system-bitrate1000000 width1280 height720 / /switch /body /smil把这个SMIL文件放到vod应用的content目录下然后在播放地址里把文件名换成smil文件名rtsp://192.168.1.100:554/vod/mp4:test_multi.smilWOWZA会根据播放器的带宽情况自动选择合适的码率流。我自己做HLS测试时会用这种方式模拟多码率自适应场景效果很直观。7.3 低延迟调优的几个关键参数如果你需要把HLS延迟从默认的十几秒降低到一个更可接受的范围可以在WOWZA后台调整几个参数在Server Properties里把HTTP Streaming Cache Duration降到较低的值在live应用的属性中把HLS分片时长调小比如从默认的6秒调整到2秒关闭不必要的录制功能减少服务端写盘的负载这几个参数调整后HLS的端到端延迟会从10秒以上降到3到5秒左右。但要注意分片越小服务器和播放器的请求频率就越高对播放器容错能力要求也更苛刻。不必为了低延迟把分片调到1秒以下那可能会引发新的起播抖动问题。8. 写在最后的话关于测试环境的一点真实感受流媒体测试环境的事看起来很小做起来门道不少。我见过太多同事拿着一个公网RTSP地址凑合测结果出了问题时环境因素和代码因素搅在一起排查方向全是错的。自建WOWZA这套环境虽然初期要花半小时到一个小时去部署但之后每次测试都是一劳永逸的。我个人觉得如果你只是临时验证播放器VOD点播方式是投入产出比最高的路径三步就能出流。如果你要做直播链路调试那就把live应用和ffmpeg这条推流链路也搭起来。如果后面要测压力WOWZA搭配几个ffmpeg脚本足够模拟几十路并发了。一个小经验所有测试地址都建议用文件的实际名称做区分不要全叫test.mp4。我习惯把文件名用场景_分辨率_编码_时间的方式命名比如pltv_720p_h264_120s.mp4这样地址看一眼就知道链路应该怎样排查问题也会快很多。希望这篇内容能帮你少走点弯路。测试流不折腾但折腾一次后面就能安心写代码了。