官方网站:
GitHub 仓库:
Live555
Live555是一个开源的多媒体流处理库,主要用于实现RTP(实时传输协议)和RTSP(实时流协议)媒体流的发送和接收。该库由Live Networks, Inc.开发,广泛应用于网络摄像头、IPTV、视频会议等需要实时传输音视频数据的领域。
主要特点
- 支持多种媒体格式:Live555支持各种音频和视频格式的传输,如H.264、H.265、MPEG、AAC等。
- 跨平台:该库可以在多个操作系统上使用,包括Windows、Linux、macOS等。
- 高效的网络传输:使用RTP/RTCP协议,实现低延迟和高质量的实时媒体流传输。
- 开源免费:在GNU Lesser General Public License (LGPL)下发布,允许用户自由使用、修改和分发。
主要组件
- RTSPServer:用于创建RTSP服务器,接收客户端的播放请求并传输媒体流。
- MediaSession:定义媒体会话,包含音频或视频轨道的描述和传输参数。
- RTPSink:用于将媒体数据打包成RTP包,并通过网络发送。
- RTPSource:用于接收RTP包,并解码成音频或视频数据。
常见应用
- 网络摄像头:将摄像头采集到的音视频数据通过RTSP协议实时传输到客户端。
- 视频点播:提供视频文件的实时流传输,实现点播功能。
- 实时监控:用于安全监控系统,通过网络实时传输监控视频。
Live555凭借其稳定性、高效性和灵活性,成为了许多实时流媒体应用的首选解决方案。
源码目录
Live555源码目录结构包含多个子目录,每个子目录都包含了实现特定功能的源代码文件。以下是Live555典型的源码目录结构及其简介:
目录结构
liveMedia:包含实现媒体流传输核心功能的源代码。
*.cpp
和*.hh
文件:实现和定义了各类媒体会话、传输机制、RTP/RTCP协议等核心功能。
UsageEnvironment:提供用于处理事件循环和任务调度的基础设施。
*.cpp
和*.hh
文件:定义了任务调度器、事件循环处理器等。
groupsock:处理组播和网络套接字相关的功能。
*.cpp
和*.hh
文件:实现了组播地址管理、网络套接字通信等。
BasicUsageEnvironment:提供一个简单的事件调度和环境处理实现,适用于简单的应用程序。
*.cpp
和*.hh
文件:实现了基本的任务调度器和环境类。
testProgs:包含了各种测试程序,用于测试和演示库的功能。
*.cpp
文件:实现了各种测试用例和示例程序,如RTSP服务器、客户端等。
mediaServer:包含实现一个完整的RTSP服务器所需的代码。
*.cpp
和*.hh
文件:实现了RTSP服务器的功能,可以直接用来创建RTSP服务器应用。
config.*:包含平台相关的配置文件。
config.*
文件:用于配置不同平台的编译选项。
示例目录结构
live/
|-- liveMedia/
| |-- *.cpp
| |-- *.hh
|
|-- UsageEnvironment/
| |-- *.cpp
| |-- *.hh
|
|-- groupsock/
| |-- *.cpp
| |-- *.hh
|
|-- BasicUsageEnvironment/
| |-- *.cpp
| |-- *.hh
|
|-- testProgs/
| |-- *.cpp
|
|-- mediaServer/
| |-- *.cpp
| |-- *.hh
|
|-- config.*
主要文件
liveMedia/*.cpp
和*.hh
:核心媒体传输实现,包括RTSPServer.cpp
、RTPSource.cpp
等。UsageEnvironment/*.cpp
和*.hh
:事件循环和任务调度实现,包括BasicTaskScheduler.cpp
等。groupsock/*.cpp
和*.hh
:组播和网络通信实现,包括Groupsock.cpp
、NetAddress.cpp
等。BasicUsageEnvironment/*.cpp
和*.hh
:基本任务调度器和环境类实现,包括BasicTaskScheduler0.cpp
等。testProgs/*.cpp
:测试和示例程序,如testRTSPClient.cpp
、testOnDemandRTSPServer.cpp
等。mediaServer/*.cpp
和*.hh
:完整的RTSP服务器实现,如live555MediaServer.cpp
等。
liveMedia
运转流程
关键组件
RTSPServer:
- 处理客户端的 RTSP 请求,包括 SETUP、PLAY、PAUSE、TEARDOWN 等。
- 管理多个
ServerMediaSession
。
RTSPClient:
- 向 RTSP 服务器发送请求并接收响应。
- 负责解析 SDP(Session Description Protocol)描述。
ServerMediaSession:
- 表示一个完整的媒体会话,包含一个或多个
ServerMediaSubsession
。 - 定义媒体会话的属性和配置。
- 表示一个完整的媒体会话,包含一个或多个
ServerMediaSubsession:
- 表示媒体会话中的一个子会话,通常是音频或视频轨道。
- 提供创建
RTPSink
的方法,用于传输媒体数据。
RTPSink:
- 将媒体数据打包成 RTP 包并通过网络发送。
- 支持多种媒体格式,如 H.264、MPEG、AAC 等。
RTPSource:
- 接收 RTP 包并解码成媒体数据。
- 用于客户端接收媒体流。
MediaSession:
- 表示一个客户端的媒体会话,包含一个或多个
MediaSubsession
。
- 表示一个客户端的媒体会话,包含一个或多个
MediaSubsession:
- 表示媒体会话中的一个子会话,通常是音频或视频轨道。
- 定义如何接收和处理媒体数据。
运转流程
RTSP 服务器的启动和运行
创建 TaskScheduler 和 UsageEnvironment:
- 任务调度器负责管理事件循环和异步任务。
- 使用环境封装了调度器和全局环境变量。
创建 RTSPServer:
- RTSPServer 监听客户端的连接请求,并处理 RTSP 命令。
创建 ServerMediaSession 并添加到 RTSPServer:
- 为每个媒体流创建 ServerMediaSession。
- 每个 ServerMediaSession 包含一个或多个 ServerMediaSubsession,表示音频或视频轨道。
启动事件循环:
- 进入事件循环,等待并处理客户端请求。
RTSP 客户端的连接和媒体流接收
发送 DESCRIBE 请求:
- 客户端向服务器发送 DESCRIBE 请求,获取媒体描述(SDP)。
发送 SETUP 请求:
- 客户端向服务器发送 SETUP 请求,初始化传输通道(RTP 和 RTCP)。
发送 PLAY 请求:
- 客户端向服务器发送 PLAY 请求,开始接收 RTP 数据流。
接收和解码 RTP 数据流:
- 客户端使用 RTPSource 接收 RTP 包,并解码成媒体数据。
概念
RTSP(实时流协议):
- RTSP 是一种网络控制协议,主要用于控制音视频流的传输。它允许客户端通过命令(如 PLAY、PAUSE、TEARDOWN)来控制媒体流的播放。
RTP(实时传输协议):
- RTP 是一种用于在互联网上传输实时数据的协议,主要用于传输音频和视频。它提供了时间戳和序列号来确保数据包的顺序和同步。
RTCP(实时传输控制协议):
- RTCP 与 RTP 协同工作,用于监控数据传输的质量和提供有关传输统计信息的反馈。
MediaSession:
- MediaSession 表示一个媒体会话,包括一个或多个媒体流(如音频和视频轨道)。它定义了媒体流的参数和配置。
TaskScheduler 和 EventLoop:
- TaskScheduler 是一个任务调度器,用于处理异步事件。EventLoop 是一个事件循环,负责监听和处理网络事件。
Groupsock:
- Groupsock 是一个抽象层,用于处理多播和单播套接字通信。
流程
RTSP 服务器初始化流程:
- 创建
TaskScheduler
和UsageEnvironment
实例。 - 创建
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();
- 创建
RTSP 客户端请求流程:
- 客户端通过发送 DESCRIBE 请求获取媒体描述(SDP)。
- 客户端发送 SETUP 请求,初始化传输通道。
- 客户端发送 PLAY 请求,开始接收 RTP 流。
- 客户端发送 PAUSE 或 TEARDOWN 请求来暂停或停止流媒体传输。
RTP 数据流传输流程:
- 服务器端使用
RTPSink
将媒体数据打包成 RTP 包并发送。 - 客户端使用
RTPSource
接收 RTP 包并解码成媒体数据。 - 使用 RTCP 监控传输质量,并提供统计信息。
- 服务器端使用
C/C++音视频流媒体 大厂面试题、学习资料、教学视频和学习路线图(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),↓↓↓↓↓↓见下面文章底部点击免费领取↓↓↓↓↓↓