前言
流程图
流程说明:
- 客户端发起tcp请求,如向真实相机设备请求,端口一般默认554;
- tcp连接成功,客户端与服务端开始rtsp信令交互;
- 客户端收到play命令响应后,开启线程等待接收数据,同时开启定时器,定时向服务端发送命令用于心跳保活;
- 服务端向客户端发送音视频数据;
- 客户端接收rtp数据并进行解复用;
设计
// 建立tcp连接
m_tcpClient = std::make_shared<TcpClient>(nullptr, this);
if (!m_tcpClient.get()
|| 0 != m_tcpClient->TcpCreate()
|| 0 != m_tcpClient->TcpConnectByTime(ip.c_str(), port, 5)
|| 0 != m_tcpClient->TcpSetNoBlock(true)
|| 0 != m_tcpClient->TcpRecvTimeout(10))
break;
// 创建command类
m_command = std::make_shared<CRtspCommand>(RTSP_TRANSPORT_RTP_TCP, 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;
bool CRtspCommand::CreateRtspClient(const std::string& uri, const std::string& username, const std::string& userpasswd)
{
if (uri.empty() || username.empty() || userpasswd.empty())
return false;
rtsp_client_handler_t handler;
handler.send = SendCallback;
handler.rtpport = RtpPortCallcback;
handler.onannounce = AnnounceCallback;
handler.ondescribe = DescribeCallback;
handler.onsetup = SetupCallback;
handler.onplay = PlayCallback;
handler.onpause = PauseCallback;
handler.onteardown = TeardownCallback;
handler.onrtp = RtpDataCallback;
m_rtsp = rtsp_client_create(uri.c_str(), username.c_str(), userpasswd.c_str(), &handler, this);
if (!m_rtsp)
return false;
return true;
}
#define RECV_DATA_SIZE (64*1024*1024)
void CRtsp::RtspWorker()
{
std::shared_ptr<char> dataPacket(new char[RECV_DATA_SIZE], std::default_delete<char[]>());
memset(dataPacket.get(), 0x00, RECV_DATA_SIZE);
int recvLen = 0;
while (m_running)
{
recvLen = m_tcpClient->TcpRecv(dataPacket.get(), RECV_DATA_SIZE);
if (recvLen <= 0) // 数据接收失败
{
break;
}
if (0 != m_command->InputData(dataPacket.get(), recvLen))
{
break;
}
memset(dataPacket.get(), 0x00, STREAM_DATA_SIZE);
}
}
// 创建定时器
m_timer = std::make_shared<ZDTimer>(10, 1000);
m_timer->Start();
// 开启定时器
m_timer->AddTask(10000, [this]() {
// 10s发送一次get parameter命令
int count = rtsp_client_media_count((rtsp_client_t*)m_rtsp);
if (count > 0)
rtsp_client_get_parameter(m_rtsp, 0, NULL);
});
// 停止定时器
if (m_timer.get())
{
m_timer->Stop();
m_timer.reset();
}
// 1.创建解复用器
m_demuxer = rtp_demuxer_create(100, profile ? profile->frequency : 90000, payload, encoding.c_str(), RtpPacketCallback, this);
// 2. 塞数据
rtp_demuxer_input(m_demuxer, data, len);
// 3. 数据回调
static int RtpPacketCallback (void* param, const void* packet, int bytes, uint32_t timestamp, int flags)
{
// 裸流数据处理
}
// 4. 销毁
rtp_demuxer_destroy(&m_demuxer);
效果
原文地址:https://blog.csdn.net/www_dong/article/details/134677826
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_5239.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。