开源复制NDI最核心的“自动发现”能力

可以实现 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实现略有差异

相关推荐
肖爱Kun7 个月前
MPEG-TS 封装的核心逻辑
srt协议
小曾同学.com10 个月前
SRT协议推拉流
ffmpeg·实时音视频·vlc·obs·srt协议·srt推拉流
却道天凉_好个秋2 年前
音视频学习(二十七):SRT协议
音视频·srt协议