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);
}
目录
相关文章
|
网络架构
udp的简单整理
udp的简单整理
814 0
|
Kubernetes 应用服务中间件 HSF
容器服务 kubernetes(ACK)中应用优雅上下线
容器服务 kubernetes(ACK)中应用优雅上下线
7996 0
|
9月前
|
前端开发 索引 容器
鸿蒙Next实现瀑布流布局
在开始实现瀑布流布局前,需确保已安装好 DevEco Studio,且已配置好鸿蒙开发环境。打开 DevEco Studio,新建一个鸿蒙应用项目,选择合适的模板(如 Empty Feature Ability),设置项目名称、包名等信息,完成项目创建。
146 0
鸿蒙Next实现瀑布流布局
|
网络协议 开发工具 C#
RTSP协议探究和RTSP播放器技术实现
RTSP播放器可广泛应用于对延迟要求比较高的场景下,比如协同操控相关的智能机器人或无人机、实时视频监控、远程视频会议、网络电视等。通过控制信令实现对流媒体数据的远程控制和传输管理。
1518 0
|
缓存 监控 Java
优化Spring Boot应用的数据库访问性能
优化Spring Boot应用的数据库访问性能
|
Web App开发 编解码 监控
直播协议
【10月更文挑战第26天】不同的直播协议具有不同的特点和应用场景。在选择直播协议时,需要根据直播的需求、目标受众、网络环境等因素进行综合考虑,以选择最适合的直播协议,确保直播的流畅性、稳定性和高质量。
|
人工智能 编译器 C语言
|
编解码 自然语言处理 数据挖掘
Nomic Embed:能够复现的SOTA开源嵌入模型
Nomic-embed-text是2月份刚发布的,并且是一个完全开源的英文文本嵌入模型,上下文长度为8192。它在处理短文和长文本任务方面都超越了现有的模型,如OpenAI的Ada-002和text-embedding-3-small。该模型有137M个参数在现在可以算是非常小的模型了。
1212 1
|
监控 数据可视化 Linux
使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问
使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问