1. 官方网站
  1. GitHub 仓库

Live555

Live555是一个开源的多媒体流处理库,主要用于实现RTP(实时传输协议)和RTSP(实时流协议)媒体流的发送和接收。该库由Live Networks, Inc.开发,广泛应用于网络摄像头、IPTV、视频会议等需要实时传输音视频数据的领域。

主要特点
  1. 支持多种媒体格式:Live555支持各种音频和视频格式的传输,如H.264、H.265、MPEG、AAC等。
  2. 跨平台:该库可以在多个操作系统上使用,包括Windows、Linux、macOS等。
  3. 高效的网络传输:使用RTP/RTCP协议,实现低延迟和高质量的实时媒体流传输。
  4. 开源免费:在GNU Lesser General Public License (LGPL)下发布,允许用户自由使用、修改和分发。
主要组件
  • RTSPServer:用于创建RTSP服务器,接收客户端的播放请求并传输媒体流。
  • MediaSession:定义媒体会话,包含音频或视频轨道的描述和传输参数。
  • RTPSink:用于将媒体数据打包成RTP包,并通过网络发送。
  • RTPSource:用于接收RTP包,并解码成音频或视频数据。
常见应用
  • 网络摄像头:将摄像头采集到的音视频数据通过RTSP协议实时传输到客户端。
  • 视频点播:提供视频文件的实时流传输,实现点播功能。
  • 实时监控:用于安全监控系统,通过网络实时传输监控视频。

Live555凭借其稳定性、高效性和灵活性,成为了许多实时流媒体应用的首选解决方案。

源码目录

Live555源码目录结构包含多个子目录,每个子目录都包含了实现特定功能的源代码文件。以下是Live555典型的源码目录结构及其简介:

目录结构
  1. liveMedia:包含实现媒体流传输核心功能的源代码。
  • *.cpp*.hh 文件:实现和定义了各类媒体会话、传输机制、RTP/RTCP协议等核心功能。
  1. UsageEnvironment:提供用于处理事件循环和任务调度的基础设施。
  • *.cpp*.hh 文件:定义了任务调度器、事件循环处理器等。
  1. groupsock:处理组播和网络套接字相关的功能。
  • *.cpp*.hh 文件:实现了组播地址管理、网络套接字通信等。
  1. BasicUsageEnvironment:提供一个简单的事件调度和环境处理实现,适用于简单的应用程序。
  • *.cpp*.hh 文件:实现了基本的任务调度器和环境类。
  1. testProgs:包含了各种测试程序,用于测试和演示库的功能。
  • *.cpp 文件:实现了各种测试用例和示例程序,如RTSP服务器、客户端等。
  1. mediaServer:包含实现一个完整的RTSP服务器所需的代码。
  • *.cpp*.hh 文件:实现了RTSP服务器的功能,可以直接用来创建RTSP服务器应用。
  1. config.*:包含平台相关的配置文件。
  • config.* 文件:用于配置不同平台的编译选项。
示例目录结构
live/
|-- liveMedia/
|   |-- *.cpp
|   |-- *.hh
|
|-- UsageEnvironment/
|   |-- *.cpp
|   |-- *.hh
|
|-- groupsock/
|   |-- *.cpp
|   |-- *.hh
|
|-- BasicUsageEnvironment/
|   |-- *.cpp
|   |-- *.hh
|
|-- testProgs/
|   |-- *.cpp
|
|-- mediaServer/
|   |-- *.cpp
|   |-- *.hh
|
|-- config.*
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
主要文件
  • liveMedia/*.cpp*.hh:核心媒体传输实现,包括RTSPServer.cppRTPSource.cpp等。
  • UsageEnvironment/*.cpp*.hh:事件循环和任务调度实现,包括BasicTaskScheduler.cpp等。
  • groupsock/*.cpp*.hh:组播和网络通信实现,包括Groupsock.cppNetAddress.cpp等。
  • BasicUsageEnvironment/*.cpp*.hh:基本任务调度器和环境类实现,包括BasicTaskScheduler0.cpp等。
  • testProgs/*.cpp:测试和示例程序,如testRTSPClient.cpptestOnDemandRTSPServer.cpp等。
  • mediaServer/*.cpp*.hh:完整的RTSP服务器实现,如live555MediaServer.cpp等。

liveMedia运转流程

关键组件
  1. RTSPServer
  • 处理客户端的 RTSP 请求,包括 SETUP、PLAY、PAUSE、TEARDOWN 等。
  • 管理多个 ServerMediaSession
  1. RTSPClient
  • 向 RTSP 服务器发送请求并接收响应。
  • 负责解析 SDP(Session Description Protocol)描述。
  1. ServerMediaSession
  • 表示一个完整的媒体会话,包含一个或多个 ServerMediaSubsession
  • 定义媒体会话的属性和配置。
  1. ServerMediaSubsession
  • 表示媒体会话中的一个子会话,通常是音频或视频轨道。
  • 提供创建 RTPSink 的方法,用于传输媒体数据。
  1. RTPSink
  • 将媒体数据打包成 RTP 包并通过网络发送。
  • 支持多种媒体格式,如 H.264、MPEG、AAC 等。
  1. RTPSource
  • 接收 RTP 包并解码成媒体数据。
  • 用于客户端接收媒体流。
  1. MediaSession
  • 表示一个客户端的媒体会话,包含一个或多个 MediaSubsession
  1. MediaSubsession
  • 表示媒体会话中的一个子会话,通常是音频或视频轨道。
  • 定义如何接收和处理媒体数据。
运转流程
RTSP 服务器的启动和运行
  1. 创建 TaskScheduler 和 UsageEnvironment
  • 任务调度器负责管理事件循环和异步任务。
  • 使用环境封装了调度器和全局环境变量。
  1. 创建 RTSPServer
  • RTSPServer 监听客户端的连接请求,并处理 RTSP 命令。
  1. 创建 ServerMediaSession 并添加到 RTSPServer
  • 为每个媒体流创建 ServerMediaSession。
  • 每个 ServerMediaSession 包含一个或多个 ServerMediaSubsession,表示音频或视频轨道。
  1. 启动事件循环
  • 进入事件循环,等待并处理客户端请求。
RTSP 客户端的连接和媒体流接收
  1. 发送 DESCRIBE 请求
  • 客户端向服务器发送 DESCRIBE 请求,获取媒体描述(SDP)。
  1. 发送 SETUP 请求
  • 客户端向服务器发送 SETUP 请求,初始化传输通道(RTP 和 RTCP)。
  1. 发送 PLAY 请求
  • 客户端向服务器发送 PLAY 请求,开始接收 RTP 数据流。
  1. 接收和解码 RTP 数据流
  • 客户端使用 RTPSource 接收 RTP 包,并解码成媒体数据。

概念

  1. RTSP(实时流协议)
  • RTSP 是一种网络控制协议,主要用于控制音视频流的传输。它允许客户端通过命令(如 PLAY、PAUSE、TEARDOWN)来控制媒体流的播放。
  1. RTP(实时传输协议)
  • RTP 是一种用于在互联网上传输实时数据的协议,主要用于传输音频和视频。它提供了时间戳和序列号来确保数据包的顺序和同步。
  1. RTCP(实时传输控制协议)
  • RTCP 与 RTP 协同工作,用于监控数据传输的质量和提供有关传输统计信息的反馈。
  1. MediaSession
  • MediaSession 表示一个媒体会话,包括一个或多个媒体流(如音频和视频轨道)。它定义了媒体流的参数和配置。
  1. TaskScheduler 和 EventLoop
  • TaskScheduler 是一个任务调度器,用于处理异步事件。EventLoop 是一个事件循环,负责监听和处理网络事件。
  1. Groupsock
  • Groupsock 是一个抽象层,用于处理多播和单播套接字通信。

流程

  1. RTSP 服务器初始化流程
  • 创建 TaskSchedulerUsageEnvironment 实例。
  • 创建 RTSPServer 实例。
  • 为每个媒体会话创建 ServerMediaSession,并将其添加到 RTSPServer
  • 启动事件循环,监听客户端的 RTSP 请求。
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);
RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554);

ServerMediaSession* sms = ServerMediaSession::createNew(*env, "stream1", ...);
rtspServer->addServerMediaSession(sms);

env->taskScheduler().doEventLoop();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  1. RTSP 客户端请求流程
  • 客户端通过发送 DESCRIBE 请求获取媒体描述(SDP)。
  • 客户端发送 SETUP 请求,初始化传输通道。
  • 客户端发送 PLAY 请求,开始接收 RTP 流。
  • 客户端发送 PAUSE 或 TEARDOWN 请求来暂停或停止流媒体传输。
  1. RTP 数据流传输流程
  • 服务器端使用 RTPSink 将媒体数据打包成 RTP 包并发送。
  • 客户端使用 RTPSource 接收 RTP 包并解码成媒体数据。
  • 使用 RTCP 监控传输质量,并提供统计信息。