如何获取不同厂商及型号摄像头的RTSP子流地址?
获取任意型号摄像头RTSP子流路径的可行方案
一、ONVIF工具的进阶用法(解决你之前只拿到主流的问题)
大部分ONVIF客户端默认仅展示第一个Profile(对应主流),但实际上摄像头的ONVIF Media服务会返回所有流配置文件(Profile),每个Profile对应一个独立的流(主/子/第三流)。你需要遍历所有Profile来提取子流的RTSP地址:
Python库实现(onvif-zeep)
onvif-zeep是目前最稳定的ONVIF Python客户端库,直接调用GetProfiles接口获取所有流配置,再通过GetStreamUri获取对应RTSP地址:
from onvif import ONVIFCamera def get_all_rtsp_streams(ip, port, user, password): # 初始化ONVIF连接 cam = ONVIFCamera(ip, port, user, password) media_service = cam.create_media_service() # 获取所有流配置Profile profiles = media_service.GetProfiles() streams = [] for idx, profile in enumerate(profiles): # 获取对应Profile的RTSP流地址 stream_uri = media_service.GetStreamUri({ 'StreamSetup': {'Stream': 'RTP-Unicast', 'Transport': {'Protocol': 'RTSP'}}, 'ProfileToken': profile.token }) streams.append({ 'stream_type': f'主/子流{idx+1}', 'rtsp_url': stream_uri.Uri, 'profile_token': profile.token }) return streams # 调用示例 streams = get_all_rtsp_streams("192.168.1.100", 80, "admin", "123456") for stream in streams: print(f"{stream['stream_type']}: {stream['rtsp_url']}")
这段代码会返回摄像头所有可用的RTSP流,通常第一个是主流,后续的就是子流或其他附加流。
二、通用探测与规则匹配
如果摄像头不支持ONVIF,可尝试基于主流地址推导子流地址,不同厂商的子流命名有一定规律:
- 海康威视:主流
rtsp://user:pass@ip:554/h264/ch1/main/av_stream→ 子流rtsp://user:pass@ip:554/h264/ch1/sub/av_stream - 大华:主流
rtsp://user:pass@ip:554/cam/realmonitor?channel=1&subtype=0→ 子流修改subtype=1 - 通用格式:将主流地址中的
main替换为sub/substream,或添加/sub后缀,比如rtsp://ip:554/main→rtsp://ip:554/sub
可用ffmpeg快速验证地址是否有效:
ffmpeg -i rtsp://user:pass@ip:554/substream -vcodec copy -acodec copy -f null -
如果命令无报错,说明子流地址有效。
三、摄像头Web管理界面
几乎所有网络摄像头的Web后台都会在「视频设置」或「编码配置」页面直接显示主/子流的RTSP地址,这是最直接的方式:
- 登录摄像头IP的Web管理页
- 找到「编码设置」「流设置」板块
- 查看「子流」对应的RTSP发布地址
四、厂商SDK调用
对于特定厂商的摄像头(如海康、大华),可使用官方提供的SDK直接获取子流地址:
- 海康SDK:调用
NET_DVR_GetRealPlayURL接口,指定子流通道参数 - 大华SDK:调用
CLIENT_GetRealPlayURL,设置子流类型标识
缺点是需要针对不同厂商适配代码,通用性差,但兼容性最好。
注意事项
- 确保摄像头已开启子流功能:部分摄像头默认关闭子流,需在Web后台或ONVIF配置中启用
- ONVIF兼容性:部分小众品牌摄像头可能仅部分支持ONVIF,需确认摄像头的ONVIF版本
- 认证权限:部分摄像头需要管理员权限才能获取流地址,普通用户可能无法访问
内容的提问来源于stack exchange,提问作者Bond_007
相关产品推荐
相关产品推荐

