网站建网站建设和优网站设计网站建设公司
web/
2025/9/30 10:41:02/
文章来源:
网站建网站建设和优,网站设计网站建设公司,企业域名免费申请,便宜做外贸网站前言
本文主要介绍通过udp方式实现rtsp拉流。
流程图 流程说明#xff1a;
相较于tcp方式“信令数据”复用同一连接拉流#xff0c;udp方式拉流“信令数据”采用不同的连接#xff0c;信令传输采用tcp#xff0c;流数据传输采用udp#xff1b;客户端向服务端#xff0…前言
本文主要介绍通过udp方式实现rtsp拉流。
流程图 流程说明
相较于tcp方式“信令数据”复用同一连接拉流udp方式拉流“信令数据”采用不同的连接信令传输采用tcp流数据传输采用udp客户端向服务端设备等发起tcp请求用于后续信令交互tcp连接成功后开始rtsp信令交互describe、setup、play等rtsp链路需要保活客户端选择两个未用的端口创建udp链路一个用于rtp数据传输一个用于rtcp数据传输连接成功后服务端设备等发送数据至客户端客户端对数据解复用、解码、播放
设计
客户端向服务端设备等发起tcp请求创建socket、connect、设置recv超时时间
m_tcpClient std::make_sharedZDTcpClient(nullptr, this);
if (!m_tcpClient.get()|| 0 ! m_tcpClient-TcpCreate()|| 0 ! m_tcpClient-TcpConnect(ip.c_str(), port)|| 0 ! m_tcpClient-TcpSetNoBlock(true)|| 0 ! m_tcpClient-TcpRecvTimeout(10))break;tcp连接成功后创建rtsp客户端开始rtsp信令交互
// 参数1(RTSP_TRANSPORT_RTP_UDP)指明使用udp方式收流
m_command std::make_sharedCRtspCommand(RTSP_TRANSPORT_RTP_UDP, m_tcpClient, m_func, m_user);
if (!m_command.get())break;// 创建rtsp client
if (!m_command-CreateRtspClient(m_rtspUrl, username, userpasswd))break;// 发送describe信令
int ret m_command-SendDescribe();
if (0 ! ret)break;创建udp链路
int CRtspCmd::HandleRtpPort(int media, const char* source, unsigned short rtp[2], char* ip, int len)
{int ret -1;switch (m_transport){case RTSP_TRANSPORT_RTP_UDP:ret sockpair_create(0.0.0.0, m_rtp[media], m_port[media]);if (0 ! ret){return -1;}rtp[0] m_port[media][0];rtp[1] m_port[media][1];break;default:assert(0);return -1;}return m_transport;
}启动udp收流
int CRtspUdpData::Start(int count, socket_t rtp[2], const char* peer, int peerport[2], int payload, const char* encoding)
{// 创建解复用器const struct rtp_profile_t* profile rtp_profile_find(payload);m_demuxer rtp_demuxer_create(100, profile ? profile-frequency : 90000, payload, encoding, RtpPacketCB, this);if (!m_demuxer)return -1;if (0 ! CreatePacker_(payload, encoding)){rtp_demuxer_destroy(m_demuxer);return -1;}m_encoding encoding;m_payload payload;m_socket[0] rtp[0];m_socket[1] rtp[1];// 启动数据接收线程m_thread std::thread(UdpDataThread, this);return 0;
}读rtp和rtcp数据
// 读rtp数据
int CRtspUdpData::RtpRead_(socket_t s)
{if (!m_demuxer)return -1;struct sockaddr_storage ss;socklen_t len sizeof(ss);int dataLen recvfrom(s, m_rtpBuffer, sizeof(m_rtpBuffer), 0, (struct sockaddr*)ss, len);if (dataLen 12){return -1;}// 视频数据解复用return rtp_demuxer_input(m_demuxer, m_rtpBuffer, dataLen);
}// 读rtcp数据
int CRtspUdpData::RtcpRead_(socket_t s)
{if (!m_demuxer)return -1;struct sockaddr_storage ss;socklen_t len sizeof(ss);int dataLen recvfrom(s, m_rtcpBuffer, sizeof(m_rtcpBuffer), 0, (struct sockaddr*)ss, len);if (dataLen 12){return -1;}return rtp_demuxer_input(m_demuxer, m_rtcpBuffer, dataLen);
}效果
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84412.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!