首页
/ Haivision SRT API 深度解析与使用指南

Haivision SRT API 深度解析与使用指南

2025-07-09 08:00:21作者:宣聪麟

前言

SRT (Secure Reliable Transport) 是一种开源视频传输协议,旨在优化不可预测网络环境下的流媒体传输质量。本文将深入解析 SRT 的 C API 接口,帮助开发者掌握其核心功能与使用方法。

1. SRT API 基础架构

SRT API 设计源于 UDT 协议,但进行了多项重要改进。整个 API 主要分为以下几个功能模块:

  • 初始化与清理
  • 套接字创建与管理
  • 绑定与连接
  • 数据传输
  • 阻塞与非阻塞模式
  • 传输类型控制

2. 初始化和清理

在使用任何 SRT 功能前,必须调用初始化函数:

srt_startup();

这个函数会启动必要的后台线程,因此应谨慎选择调用时机。

程序退出前应调用清理函数:

srt_cleanup();

3. 套接字管理

3.1 创建套接字

SRTSOCKET sock = srt_create_socket();

SRTSOCKET 实际上是 int 类型的别名,遵循 UDT 的传统命名约定。

3.2 关闭套接字

srt_close(sock);

注意:虽然此函数会立即释放大部分资源,但一些清理工作会在后台线程中完成。

4. 连接管理

4.1 基本连接模式

SRT 支持两种基本连接模式:

  1. 服务器模式

    • srt_bind() - 绑定本地地址
    • srt_listen() - 开始监听
    • srt_accept() - 接受连接
  2. 客户端模式

    • srt_connect() - 发起连接

4.2 高级连接模式:Rendezvous

SRT 特有的 Rendezvous 模式允许双方同时连接:

srt_rendezvous(sock, 
              (sockaddr*)&local_addr, sizeof(local_addr),
              (sockaddr*)&remote_addr, sizeof(remote_addr));

关键点:

  • 双方必须使用相同端口
  • 连接失败时需手动处理错误和关闭套接字

5. 数据传输

5.1 基本API

// 发送数据
int bytes_sent = srt_send(sock, buffer, buffer_size);

// 接收数据
int bytes_received = srt_recv(sock, buffer, buffer_size);

5.2 高级API

// 发送带控制信息的数据
SRT_MSGCTRL mc = srt_msgctrl_default;
srt_sendmsg2(sock, buffer, buffer_size, &mc);

// 接收带控制信息的数据
srt_recvmsg2(sock, buffer, buffer_size, &mc);

SRT_MSGCTRL 结构体包含重要控制信息:

  • msgttl: 消息生存时间(ms)
  • inorder: 是否保证顺序传输
  • srctime: 时间戳(微秒)
  • pktseq: 数据包序列号
  • msgno: 消息编号

6. 工作模式

6.1 阻塞与非阻塞模式

通过以下选项控制:

  • SRTO_SNDSYN: 发送操作阻塞模式
  • SRTO_RCVSYN: 接收操作阻塞模式

非阻塞模式下需要使用 EPoll 机制监控事件。

6.2 EPoll 机制

SRT 提供了用户级的 EPoll 实现:

// 创建epoll容器
int epid = srt_epoll_create();

// 添加监控的socket
srt_epoll_add_usock(epid, sock, &events);

// 等待事件
srt_epoll_wait(epid, read_fds, &rnum, write_fds, &wnum, timeout_ms, ...);

支持的事件类型:

  • SRT_EPOLL_IN: 可读事件
  • SRT_EPOLL_OUT: 可写事件
  • SRT_EPOLL_ERR: 错误事件
  • SRT_EPOLL_ET: 边缘触发模式

7. 传输类型

SRT 提供两种主要传输模式:

7.1 实时模式 (Live)

默认模式,特点:

  • 低延迟优先
  • 自动丢弃过期数据包
  • 适合直播场景

设置方法:

int trans_type = SRTT_LIVE;
srt_setsockopt(sock, 0, SRTO_TRANSTYPE, &trans_type, sizeof(trans_type));

7.2 文件模式 (File)

特点:

  • 可靠性优先
  • 保证数据完整传输
  • 适合文件传输

设置方法:

int trans_type = SRTT_FILE;
srt_setsockopt(sock, 0, SRTO_TRANSTYPE, &trans_type, sizeof(trans_type));

8. 最佳实践

  1. 错误处理:始终检查API返回值,SRT提供了详细的错误码
  2. 资源管理:确保每个srt_create_socket()都有对应的srt_close()
  3. 性能调优:根据应用场景选择合适的传输模式和缓冲区大小
  4. 多线程:SRT套接字不是线程安全的,需要自行管理同步

结语

SRT API 提供了强大而灵活的视频传输控制能力。通过合理配置传输模式和参数,可以在各种网络环境下实现高质量的视频传输。建议开发者从简单示例开始,逐步深入理解各项功能特性。