可以实现 mDNS + SRT 组合方案,这实际上是将NDI最核心的"自动发现"能力与SRT专业的"传输可靠性"结合 ,构建一个开放、去中心化、低延迟的视频传输系统。这种组合在技术上非常合理,甚至可以说是对NDI架构的"开放标准复刻"。
下面我将详细解析其原理、实现方式、技术挑战及与NDI的对比。
🧩 一、方案核心架构:mDNS如何与SRT协作
在这个组合中,两者各司其职,完美互补:

关键:mDNS不仅提供IP和端口,更重要的是通过TXT记录传递SRT连接所需的元数据(如StreamID),这正是NDI自动发现的核心机制。
🛠️ 二、具体实现方案
实现此方案需要解决三个核心问题:服务注册、服务发现、连接建立。
步骤一:定义SRT的mDNS服务类型
首先需要约定一个标准的服务类型,让发送端和接收端能够互相识别。推荐使用:
• 服务类型: _srt-video._tcp.local. 或 _ndi._tcp.local.(后者可兼容部分现有NDI工具)
步骤二:发送端(编码器)实现 - 注册服务
发送端需要在启动SRT流后,向局域网注册mDNS服务。这可以通过以下方式实现:
方法1:使用Avahi(Linux)
1. 安装avahi-daemon和avahi-utils
sudo apt-get install avahi-daemon avahi-utils
2. 使用avahi-publish注册服务
格式:avahi-publish -s <服务名> <服务类型> <端口> TXT记录...
avahi-publish -s "VELA SDI Pro - Camera 1" \
_srt-video._tcp \
5004 \
"streamid=vela_sdi_pro_cam1" \
"encoding=h264" \
"resolution=1920x1080" \
"framerate=50" \
"latency=120" \
"bitrate=8000000"
方法2:使用Python(跨平台)
from zeroconf import Zeroconf, ServiceInfo
import socket
import time
配置SRT参数
srt_port = 5004
stream_id = "vela_sdi_pro_cam1"
获取本机IP
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
创建服务信息
info = ServiceInfo(
"_srt-video._tcp.local.",
"VELA SDI Pro - Camera 1._srt-video._tcp.local.",
addresses=socket.inet_aton(ip_address),
port=srt_port,
properties={
'streamid': stream_id,
'encoding': 'h264',
'resolution': '1920x1080',
'framerate': '50',
'latency': '120',
'bitrate': '8000000'
},
server=f"{hostname}.local."
)
注册服务
zeroconf = Zeroconf()
zeroconf.register_service(info)
print(f"SRT服务已注册: {ip_address}:{srt_port}")
保持运行
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
zeroconf.unregister_service(info)
zeroconf.close()
步骤三:接收端(解码器)实现 - 发现与连接
接收端需要浏览mDNS服务,发现可用的SRT流,然后建立连接。
方法1:使用avahi-browse(Linux)
1. 浏览SRT视频服务
avahi-browse -t _srt-video._tcp
输出示例:
+ eth0 IPv4 VELA SDI Pro - Camera 1 _srt-video._tcp local
= eth0 IPv4 VELA SDI Pro - Camera 1 _srt-video._tcp local
hostname = vela-sdi-pro.local
address = 192.168.1.100
port = 5004
txt = "streamid=vela_sdi_pro_cam1" "encoding=h264" ...
2. 解析详细服务信息
avahi-resolve -n vela-sdi-pro.local
方法2:使用Python(跨平台)
from zeroconf import Zeroconf, ServiceBrowser
import socket
import time
class SRTListener:
def init(self):
self.found_streams = \[\]
def remove_service(self, zeroconf, type, name):
print(f"服务移除: {name}")
def add_service(self, zeroconf, type, name):
info = zeroconf.get_service_info(type, name)
if info:
addresses = ["%s:%d" % (socket.inet_ntoa(addr), info.port)
for addr in info.addresses]
解析TXT记录中的元数据
properties = {}
if info.properties:
for key, value in info.properties.items():
if isinstance(value, bytes):
value = value.decode('utf-8')
propertieskey.decode('utf-8') = value
stream_info = {
'name': name,
'address': addresses0,
'properties': properties
}
self.found_streams.append(stream_info)
print(f"\n发现SRT流: {name}")
print(f" 地址: {addresses0}")
print(f" StreamID: {properties.get('streamid', 'N/A')}")
print(f" 编码: {properties.get('encoding', 'N/A')}")
print(f" 分辨率: {properties.get('resolution', 'N/A')}")
创建监听器并浏览服务
zeroconf = Zeroconf()
listener = SRTListener()
browser = ServiceBrowser(zeroconf, "_srt-video._tcp.local.", listener)
等待发现
time.sleep(5)
使用发现的流建立SRT连接
if listener.found_streams:
stream = listener.found_streams0
srt_url = f"srt://{stream'address'}?streamid={stream'properties''streamid'}&latency=120"
print(f"\nSRT连接URL: {srt_url}")
这里可以使用FFmpeg或其他工具连接
ffmpeg -i srt://... -f sdl "Display"
zeroconf.close()
步骤四:完整的自动化工作流
将上述步骤整合,可以实现完全自动化的发现与连接:

🔧 三、高级功能与扩展
1. 服务命名与分组管理
通过mDNS的服务名称和TXT记录,可以实现类似NDI的分组管理:
服务名中包含分组信息
"VELA SDI Pro - Studio A - Camera 1"
"VELA SDI Pro - Studio B - Camera 1"
TXT记录中添加更多元数据
"group=studio_a" \
"role=main_camera" \
"tally=on_air" \
"ptz_control=enabled"
2. 与Tally系统集成
利用mDNS的TXT记录实时更新Tally状态:
TXT记录中包含多种协议支持
"transport=srt,ndi,rtmp" \
"srt_port=5004" \
"ndi_name=VELA_CAM1" \
"rtmp_url=rtmp://server/live/stream"
3. 多协议统一发现
一个mDNS服务类型可以同时描述多种传输方式:
TXT记录中包含多种协议支持
"transport=srt,ndi,rtmp" \
"srt_port=5004" \
"ndi_name=VELA_CAM1" \
"rtmp_url=rtmp://server/live/stream"
⚖️ 四、mDNS+SRT vs NDI 深度对比

🎯 五、应用场景与实施建议
最适合采用mDNS+SRT的场景:
1. 远程制作与分布式制作
• 需要通过公网进行低延迟信号回传
• mDNS在本地局域网发现设备,SRT负责跨互联网传输
• 典型场景:主会场+分会场互动、远程解说、分布式导播
2. 开放源码或定制化系统
• 不希望受NDI授权限制
• 需要与现有RTP/RTSP基础设施集成
• 典型场景:开源视频制作工具、企业内部视频系统
3. 混合协议环境
• 系统中既有NDI设备,也有SRT设备
• 需要统一发现机制管理所有设备
• 典型场景:大型场馆多系统协同、渐进式技术升级
4. 教育与研发
• 学习和理解视频传输协议原理
• 快速原型开发和算法验证
• 典型场景:高校多媒体实验室、流媒体技术原型开发
实施建议:

💎 六、总结与展望
mDNS+SRT组合不仅是可能的,而且是一个非常强大和前瞻性的方案。它代表了视频传输技术的一种演进方向:将发现能力与传输能力解耦,各自采用最适合的开放标准。
核心优势:
• 开放性:完全基于标准协议,无厂商锁定
• 灵活性:可自由组合不同协议和编码
• 适应性:SRT在网络适应性上优于NDI
• 成本效益:无需授权费用,可基于开源实现
技术挑战:
• 生态成熟度:NDI生态更成熟,工具链更完善
• 集成复杂度:需要自行处理一些NDI已经封装好的功能(如Tally)
• 跨平台一致性:不同平台的mDNS实现略有差异