live555学习笔记2-基础类

二 基础类

讲几个重要的基础类:

BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类.比如UsageEnvironment代表了整个系统运行的环境,它提供了错误记录和错误报告的功能,无论哪一个类要输出错误,就需要保存UsageEnvironment的指针.而TaskScheduler则提供了任务调度功能.整个程序的运行发动机就是它,它调度任务,执行任务(任务就是一个函数).TaskScheduler由于在全局中只有一个,所以保存在了UsageEnvironment中.而所有的类又都保存了UsageEnvironment的指针,所以谁想把自己的任务加入调度中,那是很容易的.在此还看到一个结论:整个live555(服务端)只有一个线程.


类HashTable:不用多说,实现了哈稀表.

类DelayQueue:译为"延迟队列",它是一个队列,每一项代表了一个要调度的任务(在它的fToken变量中保存).同时保存了这个任务离执行时间点的剩余时间.可以预见,它就是在TaskScheduler中用于管理调度任务的东西.注意,此队列中的任务只被执行一次!执行完后这一项即被无情抛弃!


类HandlerSet:Handler集合.Handler是什么呢?它是一种专门用于执行socket操作的任务(函数),HandlerSet被TaskScheduler用来管理所有的socket任务(增删改查).所以TaskScheduler中现在已调度两种任务了:socket任务(handlerSet)和延迟任务(DelayQueue).其实TaskScheduler还调度第三种任务:Event,介个后面再说.


类Groupsock:这个是放在单独的库Groupsock中。它封装了socket操作,增加了多播放支持和一对多单播的功能.但我只看到它对UDP的支持,好像不支持TCP。它管理着一个本地socket和多个目的地址,因为是UDP,所以只需知道对方地址和端口即可发送数据。Groupsock的构造函数有一个参数是struct in_addr const& groupAddr,在构造函数中首先会调用父类构造函数创建socket对象,然后判断这个地址,若是多播地址,则加入多播组。Groupsock的两个成员变量destRecord* fDests和DirectedNetInterfaceSet fMembers都表示目的地址集和,但我始终看不出DirectedNetInterfaceSet fMembers有什么用,且DirectedNetInterfaceSet是一个没有被继承的虚类,看起来fMembers没有什么用。仅fDesk也够用了,在addDestination()和removeDestination()函数中就是操作fDesk,添加或删除目的地址。

解释一下Groupsock::changeDestinationParameters()函数:

//改变目的地址的参数
//newDestAddr是新的目的地址
//newDestPort是新的目的端口
//newDestTTL是新的TTL
void Groupsock::changeDestinationParameters(
		struct in_addr const& newDestAddr,
		Port newDestPort,
		int newDestTTL)
{
	if (fDests == NULL)
		return;

	//获取第一个目的地址(此处不是很明白:fDest是一个单向链表,每次添加一个目的地址,
	//都会把它插入到最前目,难道这个函数仅改变最后一个添加的目的地址?)
	struct in_addr destAddr = fDests->fGroupEId.groupAddress();
	if (newDestAddr.s_addr != 0) {
		if (newDestAddr.s_addr != destAddr.s_addr
				&& IsMulticastAddress(newDestAddr.s_addr))
		{
			//如果目的地址是一个多播地址,则离开老的多播组,加入新的多播组。
			socketLeaveGroup(env(), socketNum(), destAddr.s_addr);
			socketJoinGroup(env(), socketNum(), newDestAddr.s_addr);
		}
		destAddr.s_addr = newDestAddr.s_addr;
	}

	portNumBits destPortNum = fDests->fGroupEId.portNum();
	if (newDestPort.num() != 0) {
		if (newDestPort.num() != destPortNum &&
				IsMulticastAddress(destAddr.s_addr))
		{
			//如果端口也不一样,则先更改本身socket的端口
			//(其实是关掉原先的socket的,再以新端口打开一个socket)。
			changePort(newDestPort);
			//然后把新的socket加入到新的多播组。
			// And rejoin the multicast group:
			socketJoinGroup(env(), socketNum(), destAddr.s_addr);
		}
		destPortNum = newDestPort.num();
		fDests->fPort = newDestPort;
	}

	u_int8_t destTTL = ttl();
	if (newDestTTL != ~0)
		destTTL = (u_int8_t) newDestTTL;

	//目标地址的所有信息都在fGroupEId中,所以改变成员fGroupEId。
	fDests->fGroupEId = GroupEId(destAddr, destPortNum, destTTL);
	
	//(看起来这个函数好像只用于改变多播时的地址参数,
	//以上分析是否合理,肯请高人指点)
}




### Live555库的使用与集成RTSP流媒体服务开发指南 Live555 是一个开源 C++ 库,专注于实现 RTSP 和 RTP 协议的支持。它提供了轻量级、高效的解决方案来创建自定义的流媒体服务器或客户端应用程序[^1]。以下是有关 Live555 的使用、集成以及原理的关键点说明。 #### 一、Live555 原理概述 Live555 主要实现了两个重要的协议——RTSP(Real Time Streaming Protocol)和 RTP(Real-time Transport Protocol)。其中: - **RTSP** 提供了一种似于 HTTP 的控制接口,用于启动、停止或者切换多媒体会话中的不同资源。 - **RTP** 则负责实际音视频数据包在网络上的可靠传递,并附带时间戳等元信息以保障播放顺序一致性[^3]。 在内部架构上,Live555 将功能划分为多个模块,包括但不限于输入源管理器(Media Source)、过滤器链路(Filter Chain),以及最终面向用户的 API 接口层等等[^1]。 ```cpp // 示例代码展示了如何初始化环境变量并加载动态链接库 #include "liveMedia.hh" #include "BasicUsageEnvironment.hh" int main() { TaskScheduler* scheduler = BasicTaskScheduler::createNew(); // 创建调度程序实例 UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); // 初始化其他组件... return 0; } ``` --- #### 二、Live555 集成方法 为了成功地将 Live555 集成到自己的项目当中去,开发者通常需要经历如下几个步骤: ##### 1. 下载与编译 从官方仓库下载最新版本源码后按照 README 文件指引完成本地构建工作。注意某些平台可能还需要额外安装依赖项比如 OpenSSL 来增强安全性特性支持。 ##### 2. 设计媒体管道 根据需求决定是要搭建一个完整的流媒体服务器还是仅仅作为一个简单的播放器角色存在。如果是前者的话,则需特别关注于如何接入底层硬件设备采集原始素材再经由编码转换之后形成标准化格式输出给后续环节处理;而后者相对来说较为简单只需解析远程地址即可[^2]。 ##### 3. 处理跨平台兼容性问题 由于不同的操作系统之间可能存在差异所以在移植过程中务必仔细测试每一步骤确保没有任何遗漏之处影响整体性能表现[^3]。 --- #### 三、典型应用场景举例 下面列举了一些常见的基于 Live555 构建的服务型及其特点: | 场景名称 | 描述 | |----------------|--------------------------------------------------------------------------------------| | 实时监控 | 安防领域广泛采用的方式之一就是利用 IP 摄像头持续不断地向中心节点汇报现场状况 | | 在线直播 | 对体育赛事转播或是音乐会等活动进行全球范围内同步分享 | | 远程医疗诊断 | 医生可以通过高清画质查看病患部位具体情况从而做出更加精准判断 | --- ### 总结 通过对 Live555 的深入研究可以看出这是一个非常强大同时也极具灵活性的选择方案,在满足基本业务诉求的同时还能给予足够的扩展空间让用户自行定制专属特性^。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值