菜单

RTMP 流式传输

相关源文件

目的与范围

本文档描述了 OBS Studio 中实时消息传输协议(RTMP)流媒体的实现。它涵盖了用于将直播内容流式传输到 Twitch、YouTube 和 Facebook 等平台的架构、数据流、连接过程、数据包处理和性能优化技术。有关将 FLV 文件本地录制而不是通过网络流式传输的信息,请参阅 3.5.2 的 FLV 录制文档。

系统概览

OBS Studio 中的 RTMP 流媒体工作方式是,获取编码的视频和音频帧,将它们打包成 FLV 格式的 RTMP 数据包,然后将它们发送到远程流媒体服务器。该实现包括动态比特率调整、帧丢弃管理和网络优化等功能。

来源: plugins/obs-outputs/rtmp-stream.c18-225 plugins/obs-outputs/flv-mux.c18-60

核心架构

RTMP 流结构

RTMP 实现的核心是 rtmp_stream 结构体,它管理连接状态、数据包处理和线程模型。

该结构体维护

  • 与 RTMP 服务器的连接
  • 线程安全的数据包队列
  • 状态标志(活动、连接中、已断开)
  • 编码器及其编解码器的引用
  • 缓冲区管理资源

来源: plugins/obs-outputs/rtmp-stream.h55-134

线程模型

RTMP 流媒体采用多线程方法

  1. 连接线程:负责与 RTMP 服务器建立初始连接
  2. 发送线程:管理数据包的连续发送
  3. 套接字线程:(特定于 Windows)优化套接字操作

来源: plugins/obs-outputs/rtmp-stream.c629-745 plugins/obs-outputs/rtmp-windows.c1-320

连接过程

初始化和连接

流媒体开始时,OBS

  1. 创建一个 rtmp_stream 实例
  2. 配置服务器 URL、流密钥和其他设置
  3. 建立与 RTMP 服务器的连接
  4. 发送元数据和编解码器头
  5. 开始数据包发送过程

来源: plugins/obs-outputs/rtmp-stream.c151-198 plugins/obs-outputs/rtmp-stream.c1161-1226 plugins/obs-outputs/rtmp-stream.c978-1086

RTMP 连接详情

连接使用以下信息

  • 服务器 URL (path)
  • 流密钥 (key)
  • 用户名/密码(如果需要)
  • 绑定 IP(用于多网络系统)
  • IP 系列偏好(IPv4/IPv6)

来源: plugins/obs-outputs/rtmp-stream.c1227-1335

数据包处理和流式传输

数据包流

流媒体过程遵循此流程

  1. 编码后的数据包被添加到线程安全队列中
  2. 发送线程从队列中取出数据包
  3. 数据包被混合为 FLV 格式
  4. FLV 数据包被发送到 RTMP 服务器

来源: plugins/obs-outputs/rtmp-stream.c629-745 plugins/obs-outputs/flv-mux.c376-387

数据包结构

编码后的数据包包含

字段描述
data编码帧数据
size数据的大小(字节)
pts显示时间戳
dts解码时间戳
类型视频或音频数据包
keyframe布尔值,指示是否为关键帧
track_idx用于多轨道支持的轨道索引

来源: plugins/obs-outputs/rtmp-stream.c399-458

FLV 混合

发送前,数据包被混合为 FLV 格式

  1. 元数据:包含流的信息(分辨率、帧率、比特率)
  2. 头信息:包含编解码器初始化数据
  3. 视频数据包:带有时序信息的视频帧数据
  4. 音频数据包:带有时序信息的音频帧数据

来源: plugins/obs-outputs/flv-mux.c270-389 plugins/obs-outputs/flv-mux.c447-504

性能优化

动态比特率调整

OBS 实现动态比特率调整,以在不同的网络条件下保持流的稳定性

  1. 通过数据包发送时间监测网络拥塞
  2. 检测到拥塞时降低编码器比特率
  3. 当拥塞缓解时,逐渐提高比特率

来源: plugins/obs-outputs/rtmp-stream.c585-611 plugins/obs-outputs/rtmp-stream.c41-45

帧丢弃

当发生拥塞时,OBS 使用帧丢弃策略来优先处理最重要的帧

  1. 为丢弃帧设置阈值
  2. 优先处理关键帧而非 P 帧
  3. 通过不丢弃音频帧来保持音频质量

来源: plugins/obs-outputs/rtmp-stream.c1316-1319 plugins/obs-outputs/rtmp-stream.c41-45

套接字优化

该实现包括多项套接字优化

  1. 非阻塞套接字:防止网络操作被阻塞
  2. 缓冲区管理:微调缓冲区大小以获得最佳性能
  3. 特定于 Windows 的增强功能:使用特定于 Windows 的套接字 API 以获得更好的性能

来源: plugins/obs-outputs/rtmp-stream.c989-1074 plugins/obs-outputs/rtmp-windows.c216-312

编解码器支持

OBS 中的 RTMP 支持多种编解码器

编解码器类型支持的编解码器
视频H.264(主要),HEVC*,AV1*
音频AAC

*增强型 RTMP 扩展,支持因平台而异

FLV 混合器处理每个编解码器的特定打包要求

来源: plugins/obs-outputs/flv-mux.c799-825 plugins/obs-outputs/flv-mux.h25-54

错误处理和恢复

RTMP 实现包含全面的错误处理

  1. 连接错误:使用描述性的错误代码处理
  2. 套接字错误:平台特定的套接字错误处理
  3. 流关闭:具有可配置超时时间的优雅关闭

发生错误时,OBS 会提供描述性的错误消息以帮助诊断问题。

来源: plugins/obs-outputs/rtmp-stream.c500-583

结论

OBS Studio 中的 RTMP 流媒体实现为流媒体平台提供了强大的实时内容传输系统。它通过动态比特率调整、战略性帧丢弃和优化的套接字处理等功能,平衡了性能和可靠性。多线程架构和高效的缓冲区管理即使在系统资源有限或网络状况不佳的情况下也能实现流畅的流媒体传输。

来源: plugins/obs-outputs/rtmp-stream.c plugins/obs-outputs/flv-mux.c