当前位置: 首页 > news >正文

基于QT和UDP实现一个实时RTP数据包的接收,并将数据包转化成文件

简单介绍:代码写的比较详细,需要留意的地方看结尾介绍

头文件

#ifndef RTPRECEIVER_H
#define RTPRECEIVER_H#include <QDialog>
#include <QUdpSocket>
#include <QFile>
#include <QTextStream>
#include <httpclient.h>
#include <QEventLoop>class RTPReceiver : public QWidget
{Q_OBJECT
public:explicit RTPReceiver(QWidget *parent = nullptr);~RTPReceiver();void start();void closeFile();void writeBufferToFile();void initSocket();void sendGetRequest();private slots:void readPendingDatagrams();private:QUdpSocket *udpSocket;QFile file;QByteArray buffer;int bufferSize = 1400;QString filePath;
};#endif // RTPRECEIVER_H

cpp文件

#include "rtpreceiver.h"const int RTP_HEADER_LENGTH = 12;RTPReceiver::RTPReceiver(QWidget *parent): QWidget(parent)
{this->setVisible(false);}RTPReceiver::~RTPReceiver()
{}void RTPReceiver::start()
{initSocket();}void RTPReceiver::closeFile()
{if (file.isOpen()) {file.close();}}void RTPReceiver::readPendingDatagrams()
{qDebug()<<"readPendingDatagrams方法被执行";while (udpSocket->hasPendingDatagrams()) {QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());qDebug()<<"传过来的大小"<<datagram.size();if (datagram.size() < RTP_HEADER_LENGTH) {qDebug() << "Invalid RTP packet";continue;}// QByteArray payload = datagram.mid(RTP_HEADER_LENGTH);// 将RTP数据包添加到缓冲区buffer.append(datagram.mid(12));qDebug()<<"缓存大小"<<buffer.size();// 检查缓冲区是否达到一定大小,达到则写入文件if (buffer.size() >= bufferSize) {writeBufferToFile();continue;}//代表是最后一次请求if(buffer.size()<1666){writeBufferToFile();//关闭文件closeFile();udpSocket->close();//调用whisper去翻译当前音频RequestWhisper();//重新初始化服务initSocket();continue;}}}void RTPReceiver::writeBufferToFile()
{qDebug()<<"每次写入大小"<<buffer.size();if (!file.isOpen()) {QString outputFilePath = "F:\\output.wav";filePath=outputFilePath;file.setFileName(outputFilePath);file.open(QIODevice::WriteOnly);}file.write(buffer);file.flush();buffer.clear();
}void RTPReceiver::initSocket()
{qDebug()<<"RTP服务被初始化";udpSocket = new QUdpSocket(this);bool bindResult=udpSocket->bind(QHostAddress::AnyIPv4, 1234); // 替换成实际的RTP端口if(!bindResult){qDebug()<<"绑定失败";return;}//绑定接收qDebug()<<"RTP服务监听中";connect(udpSocket, &QUdpSocket::readyRead, this, &RTPReceiver::readPendingDatagrams);
}

注意: 这里需要注意的地方是,如何判断数据包是否是最后一包,这里当时我花了一些时间,最后采取通过判断数据包大小来判断是否是最后一包,我定义的发送的RTP的数据包缓存大小是1400,然后如果小于这个大小,说明是最后一包,这样就可以执行文件关闭和一些其他命令了,还有其他的不同的方式,这里需要你们自己去了解RTP数据包

http://www.lryc.cn/news/173532.html

相关文章:

  • 云原生安全性:保护现代应用免受威胁
  • R语言绘图-3-Circular-barplot图
  • 解决Keil5下载没有对应芯片Flash的问题
  • 深拷贝与浅拷贝(对象的引用)
  • 重新认识架构—不只是软件设计
  • 我的创业笔记:困境与思索
  • minio文件上传
  • IDEA .iml文件及.idea文件夹详解
  • 使用Python做一个微信机器人
  • 云计算战略:选择适合你业务的云平台
  • Python:打印目录下每层的文件总数
  • LVS-NAT模式
  • 【神印王座】龙皓晨竟然上了头版头条!内容违背,新闻真实性原则
  • C++之类和函数权限访问总结(二百二十七)
  • 手动部署 OceanBase 集群
  • 【操作系统笔记十二】Linux常用基础命令
  • Compose LazyColumn 对比 RecyclerView ,谁的性能更好?
  • [python 刷题] 49 Group Anagrams
  • vue+element plus 使用table组件,清空用户的选择项
  • 改写软件-怎么选择改写软件
  • gateway之跨域处理
  • uniapp 实现不同用户展示不同的tabbar(底部导航栏)
  • 线性归一化是什么,用python实现数据的线性归一化
  • 超级好用绘图工具(Draw.io+Github)
  • 全国职业技能大赛云计算--高职组赛题卷③(私有云)
  • Redis SCAN命令操作实战(详细)
  • 计网第五章(运输层)(六)(TCP可靠传输的实现)
  • 酒店外卖小程序商城的作用是什么
  • 居家养老一键通的功能
  • 海外代理IP是什么?如何使用?