基于Live555框架实现一个实时流媒体服务

本文档介绍如何基于Live555框架创建一个实时流媒体服务,包括设置RTP数据传输大小、创建RTSP服务器、管理会话和流媒体源,以及从文件读取H265视频流。还展示了如何自定义FramedSource来从自定义源获取实时码流。
摘要由CSDN通过智能技术生成

env << “\n”;
}

static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
char const* streamName, char const* inputFileName) {
UsageEnvironment& env = rtspServer->envir();

env << “\n”" << streamName << “” stream, from the file “”
<< inputFileName << “”\n";
announceURL(rtspServer, sms);
}

int main(int argc, char** argv) {
// Begin by setting up our usage environment:
//照着写就行,这个时所有live555的基石,必须创建
TaskScheduler* scheduler = BasicTaskScheduler::createNew();
UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler);
//设置RTP数据的最大传输大小,根据你需要传输的H265实际的码率设置,如果设小了,程序会报错并丢包
OutPacketBuffer::maxSize = 1000000;
//创建一个rtsp的服务,这个服务实现RSTP相关协议
RTSPServer* rtspServer = RTSPServer::createNew(*env);
if (rtspServer == NULL) {
*env << "Failed to create RTSP server: " << env->getResultMsg() << “\n”;
exit(1);
}

char const* descriptionString
= “Session streamed by “LiveRTSPServer””;

// A H.265 video elementary stream:
{
char const* streamName = “video1”;
char const* inputFileName = “surfing.265”;
Boolean reuseFirstSource = true;
//创建一个会话,它会添加给rtsp服务,大概的意思就是大概的意思就是告诉rtsp服务有一个流可以它管理了
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
//当然管理之前,你需要先注册一个实例,实现里边所有的管理function,将来给rtsp服务调度。这里先实现一个live555写好的一个H265VideoFileServerMediaSubsession实例,这个实例的流程是从一个h265文件中读取数据作为RTP流的来源。等下我们主要就是要定制这个类,来实现从我们想要的位置获取数据。
sms->addSubsession(H265VideoFileServerMediaSubsession
::createNew(*env, inputFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);
//将ServerMediaSession添加到rstp服务
announceStream(rtspServer, sms, streamName, inputFileName);
}

// A H.265 video elementary stream:
//我们也可以添加多个类似的会话给rtsp服务管理
{
char const* streamName = “video2”;
char const* inputFileName = “surfing.265”;
Boolean reuseFirstSource = true;
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(H265VideoFileServerMediaSubsession
::createNew(*env, inputFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);

announceStream(rtspServer, sms, streamName, inputFileName);

}
//开始运行服务
env->taskScheduler().doEventLoop(); // does not return

return 0; // only to prevent compiler warning
}


## 4.定制自己的实时ServerMediaSubsession


在实现实时流媒体服务时,关键的一步是确定如何获取实时码流。以下是几种常见的方法:


1. **通过Linux设备文件**:直接从硬件驱动获取码流。
2. **通过共享内存或Linux的IPC**:从编码进程获取码流。
3. **使用SOA编程架构**:类似于ROS2的编程模式,在同一系统中订阅码流。  
 为了演示,我将采用第三种方法。但为避免引入ROS2的复杂性,我将使用本地lo网络的TCP socket来代替ROS2通信。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/10999361bdc9472cac57750f9d8dd6e5.png)


### 4.1大致实现思路


1. **VLC流媒体播放器请求**:VLC流媒体播放器向流媒体服务申请网络直播视频流。
2. **建立TCP连接**:流媒体服务收到请求后,通过本地lo网络的TCP socket与编码进程建立连接,并通过socket读取实时码流。
3. **编码进程发送码流**:编码进程成功创建TCP连接后,开始向客户端源源不断地发送实时码流,直到连接断开。


我们首先分析一下Live555中H265VideoFileServerMediaSubsession的实现。这将帮助我们理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值