RTSP协议的实现

简介: RTSP协议的实现

说明

  • 本内容是建立在“1.RTSP协议介绍.md”基础之上的
  • 目前代码仅实现RTSP交互部分,暂未发送实际视频数据,所以VLC播放器暂时是看不到视频的

源码

  • "test/001/test_rtsp_server.c"

源码测试

  • 首先将linux系统IP地址设置为"192.168.1.141"
  • 编译:gcc test_rtsp_server.c -lpthread
  • 运行:./a.out
  • 打开“VLC”播放器,选择“媒体”->“打开网络串流”,输入网络URL:rtsp://192.168.1.141:554
  • 点击播放后,控制台将会打印RTSP交互过程

源码讲解

  • 按照socket服务器编程模式,只不过rtsp服务器不单单只有rtsp server,还有rtp server和rtcp server共三个部分
  • rtsp负责交互控制(这也是目前实现的部分,rtp、rtcp目前均未实现)、rtp负责数据音视频传输、rtcp负责传输音视频质量控制
/*******************************RTSP STSRT**********************************/
// rtsp-创建套接字
rtspServerSockfd = socket(AF_INET, SOCK_STREAM, 0);
// rtsp-绑定套接字
bind(rtspServerSockfd, (struct sockaddr *)&rtsp_addr, sizeof(rtsp_addr));
// rtsp-开启监听
listen(rtspServerSockfd, 1); // 最多只有1个客户端连接
/*******************************RTSP END***********************************/
/*******************************RTP STSRT**********************************/
// rtp-创建套接字
rtpServerSockfd = socket(AF_INET, SOCK_STREAM, 0);
// rtp-绑定套接字
bind(rtpServerSockfd, (struct sockaddr *)&rtp_addr, sizeof(rtp_addr));
/*******************************RTP END************************************/
/*******************************RTCP START*********************************/
// rtcp-创建套接字
rtcpServerSockfd = socket(AF_INET, SOCK_STREAM, 0);
// rtcp-绑定套接字
bind(rtcpServerSockfd, (struct sockaddr *)&rtcp_addr, sizeof(rtcp_addr));
/*******************************RTCP END***********************************/
while(1)
{
    ...
    // rtsp-等待客户端连接
    accept(rtspServerSockfd,  (struct sockaddr *)&addr_client, &addr_len);
    // rtsp-创建客户端处理线程
    pthread_create(&client_thrd, NULL, pthread_handle_client, pthread_arg);
}
• 执行顺序:socket -> bind -> listen -> accept -> pthread_handle_client
• 当有客户端连接后,创建线程。执行pthread_handle_client函数,接下来看pthread_handle_client函数实现
// pthread_handle_client函数实现
while(1)
{
    // 接收客户端发来的数据
    recv_len = recv(clientSockfd, rx_buf, RX_MAX_SIZE, 0);
    // 解析客户端发来的数据
    getFirstLineFromBuf();
    sscanf();
    /* 根据第一行解析的method的不同分别实现对应的响应返回,分别是:
    ** OPTIONS    -   handleCmd_OPTIONS()
    ** DESCRIBE   -   handleCmd_DESCRIBE()
    ** SETUP      -   handleCmd_SETUP()
    ** PLAY       -   handleCmd_PLAY()
    ** TEARDOWN   -   handleCmd_TEARDOWN()
    */
    handleCmd_XXXX();
    send(clientSockfd, tx_buf, strlen(tx_buf), 0);
}
目录
相关文章
|
网络协议 开发工具 C#
RTSP协议探究和RTSP播放器技术实现
RTSP播放器可广泛应用于对延迟要求比较高的场景下,比如协同操控相关的智能机器人或无人机、实时视频监控、远程视频会议、网络电视等。通过控制信令实现对流媒体数据的远程控制和传输管理。
843 0
|
10月前
|
供应链 监控 搜索推荐
获得1688商品评论API接口的开发应用与收益
1688商品评论API接口提供丰富的商品评论数据,涵盖评论内容、用户信息、商品评分等,助力电商平台优化运营、市场分析和供应链管理,提升客户满意度与忠诚度,促进商业价值增长。
214 3
|
编解码 网络协议 流计算
RTSP协议介绍
RTSP协议介绍
1070 0
【GEC6818开发板】Linux驱动中printk无法在终端输出显示
【GEC6818开发板】Linux驱动中printk无法在终端输出显示
|
编解码
RTP传输AAC
RTP传输AAC
328 1
|
编解码 自然语言处理 数据挖掘
Nomic Embed:能够复现的SOTA开源嵌入模型
Nomic-embed-text是2月份刚发布的,并且是一个完全开源的英文文本嵌入模型,上下文长度为8192。它在处理短文和长文本任务方面都超越了现有的模型,如OpenAI的Ada-002和text-embedding-3-small。该模型有137M个参数在现在可以算是非常小的模型了。
993 1
|
机器学习/深度学习 人工智能 自然语言处理
构建未来:人工智能在持续学习系统中的进化
【4月更文挑战第27天】 随着技术的进步,人工智能(AI)已经从单一任务处理的静态系统转变为能够适应和学习新知识的动态实体。这种转变的核心在于持续学习系统(Lifelong Learning Systems),它允许AI不断积累知识,跨领域应用所学,并在不断变化的环境中保持相关性。本文将探讨AI持续学习系统的关键技术进展,包括神经网络的可塑性、转移学习和元学习策略,并分析这些技术如何推动AI向更高层次的认知能力迈进。
|
人工智能 数据挖掘 大数据
不可不知的数据分析演进史:重塑世界的里程碑与先驱者
不可不知的数据分析演进史:重塑世界的里程碑与先驱者
|
网络协议 Java Linux
在幻兽帕鲁上搭建云服务器的简易指南
想要在幻兽帕鲁上搭建自己的云服务器吗?本文将向大家展示如何使用幻兽帕鲁轻松搭建属于自己的云服务器,让大家和朋友在一个稳定、私密的云端空间中畅享游戏乐趣。 第一步:选购服务器 首先,我们需要选择一台适合的服务器。阿里云轻量应用服务器是一个不错的选择,它提供了稳定的性能和丰富的配置选项。登录阿里云官网,进入轻量应用服务器购买页面,选
413 1
在幻兽帕鲁上搭建云服务器的简易指南
|
数据采集 数据挖掘 关系型数据库
Excel计算函数(计算机二级)(1),2024年最新2024Python架构面试指南
Excel计算函数(计算机二级)(1),2024年最新2024Python架构面试指南