为了帮助大家更好地理解后续的代码,这里简要介绍一下RTP(Real-time Transport Protocol)协议的关键特点:
扩展(X):1比特。设为1时,表示在RTP报头后有一个扩展报头。
参与源数(CSRC计数):4比特。表示紧接在固定头后的CSRC标识符数量。
标记(M):1比特。由应用定义其意义,如在视频流中表示帧结束,在音频中表示谈话开始。
有效载荷类型:7比特。指示承载数据的类型(如H264、H265),用于确定解码器。
序列号:16比特。每发送一个RTP数据包,序列号加一,用于检测包损和重建包序列。
时间戳:32比特。反映第一个八进制数的采样时刻,用于同步与抖动计算。
SSRC:32比特。标识同步源,用于防止同一连接中出现相同标识。
CSRC列表:0到15项,每项32比特。表示对载荷起作用的源,由CC段给出。
这些是RTP协议的核心要素,它们共同确保了流媒体数据的有效传输。
RTCP(Real-Time Control Protocol)在流媒体传输中起着辅助作用,但它不是本文的重点,有兴趣的读者可以自行查阅更多资料。
2.Live555框架介绍
在处理流媒体服务的工作中,自行编写代码不仅耗时而且容易产生错误。因此,选择一个合适的开源媒体软件框架至关重要。常见的框架有ffmpeg、GStreamer和Live555等。
开发一个自定义实时流媒体,我特别推荐使用Live555框架,出于以下几个原因:
基于C++开发:这意味着代码不仅高效,而且具有良好的结构和可读性。
代码简洁、高效:在开发流媒体服务时,这两个特点极为重要,可以减少bug的产生。
通俗易懂:使得即使是初学者也能快速上手。
支持深度定制:为需要特定功能的开发者提供了极大的灵活性。
2.2 Live555框架介绍
Live555框架的强大功能和灵活性来源于其精心设计的几个基类。这些基类为流媒体的不同方面提供了支持。下面是这些基类的简要介绍:
首次接触live555的读者现在初步了解基本概念就行,下面实战环节帮助大家加深理解
UsageEnvironment:这是一个抽象基类,用于处理事件循环和错误报告。它定义了流媒体基本操作的环境,如日志记录、事件处理等。它代表了整个系统运行的环境,提供错误记录、报告和日志输出功能。任何需要输出错误的类都需要保存对UsageEnvironment的引用。
BasicUsageEnvironment:这个类继承自UsageEnvironment,并实现了其中的抽象方法。它还包括对TaskScheduler和HashTable等的实现。
liveMedia:这是一个关键库,包含了实现RTSP Server的类和针对不同流媒体类型(如TS流、PS流等)的编码类。其基类是Medium,具有清晰的层次结构。在这个库中,一些重要的类包括RTSPServer、ServerMediaSession、RTPSink、RTPInterface、FramedSource等。
groupsock:这个库专注于网络层,管理组播和单播套接字的创建和操作。它为数据包的发送和接收提供底层支持。groupsock库包括了GroupEId、Groupsock、GroupsockHelper、NetAddress、NetInterface等类。
3.live555定制实战
本节将指导您如何下载、安装以及定制Live555流媒体框架,特别是在嵌入式应用中的交叉编译。
3.1.live555源码下载
首先,您需要下载并安装 Live555。Live555 是一个开源的流媒体框架,可以用来设置 RTSP 服务器。您可以从(http://www.live555.com/liveMedia/) 下载源代码。
3.2 嵌入式应用交叉编译
本例中,我将使用一个aarch64的SOC来演示交叉编译的过程。进行交叉编译时,需要注意以下几个关键步骤:
修改配置文件:首先,您需要修改config.armlinux这个配置文件,这是为了确保编译过程符合您的嵌入式系统的要求。
适配C++库版本:如果您的嵌入式系统的C++库版本低于C++20,您需要在config.armlinux文件的COMPILE_OPTS项中追加-DNO_STD_LIB。这一步是必要的,以避免因版本不兼容导致的语法报错。
处理openssl库依赖:如果您的嵌入式系统中没有安装openssl库,您需要在config.armlinux文件的COMPILE_OPTS项中追加-DNO_OPENSSL=1。这样做可以防止因缺少openssl库而导致的编译错误。
通过遵循这些步骤,您可以顺利地在嵌入式系统上交叉编译Live555。
#!/bin/bash
LIVE555\_DIR=`pwd`
cd $LIVE555\_DIR
INSTALL\_DIR=