#include "QWebSocketManager.h"
const int g_nWebSocektHeartTime = 3000; //心跳包时间
const int g_nWebSocketLostConnectTime = 10000; //掉线时间
QWebSocketManager::QWebSocketManager()
{
m_pAudioOutput = nullptr;
m_pStreamOutput = nullptr;
this->InitAudioOut(); //初始化音频输出
connect(this, &QWebSocketManager::Msg_Self_HeartCmd, this, &QWebSocketManager::MsgReceived_Self_HeartCmd);
m_pWebClient = new QWebSocket;
connect(m_pWebClient, &QWebSocket::connected, this, &QWebSocketManager::MsgRecievd_Server_Connected);
connect(m_pWebClient, &QWebSocket::disconnected, this, &QWebSocketManager::MsgRecievd_Server_Disconnected);
connect(m_pWebClient, &QWebSocket::textMessageReceived, this, &QWebSocketManager::MsgRecievd_Server_TextMessageReceived);
connect(m_pWebClient, &QWebSocket::binaryMessageReceived, this, &QWebSocketManager::MsgRecievd_Server_BinaryMessageReceived);
m_bExitThreadMonitor = true; //开启监听线程
m_bSendHeartCmd = false; //默认,不发送心跳包
m_MonitorThread = std::thread(&QWebSocketManager::ThreadMonitorHeartbeat, this, this);
m_MonitorThread.detach(); //类创建则线程被开启
}
QWebSocketManager::~QWebSocketManager()
{
this->DisconnectWebSocket();
m_bExitThreadMonitor = false;
std::lock_guard<std::mutex> lck(m_dataMutex); //C11用法
delete m_pAudioOutput;
m_pAudioOutput = nullptr;
delete m_pWebClient;
m_pWebClient = nullptr;
}
void QWebSocketManager::ConnectWebSocket(QString qsUrl)
{
m_pWebClient->open(QUrl(qsUrl));
m_dwReciveTime = GetTickCount();
m_bRunningAudio = false;
}
void QWebSocketManager::DisconnectWebSocket()
{
if (m_pWebClient->state() == QAbstractSocket::SocketState::ConnectingState)
{
m_pWebClient->close();
}
std::lock_guard<std::mutex> lck(m_mutexPcm); //C11用法
m_bRunningAudio = false;
if (m_pAudioOutput->state() == QAudio::ActiveState)
{
//当前语音正在播放过程中,此时需要强制停止
m_pAudioOutput->stop();
}
}
unsigned int QWebSocketManager::ThreadMonitorHeartbeat(void* pParam)
{
QWebSocketManager* pThis = reinterpret_cast<QWebSocketManager*>(pParam);
std::lock_guard<std::mutex> lck(m_dataMutex); //C11用法
while (pThis->m_bExitThreadMonitor)
{
//差值 > 3秒且小于10秒,需要给Web服务端下发心跳包,检测是否断开连接
if (pThis->m_bSendHeartCmd == true)
{
DWORD dwCalc = GetTickCount() - pThis->m_dwReciveTime; //时间差 = 最新时间 - 模拟人上传数据时间
if (dwCalc < g_nWebSocektHeartTime)
{
//时间差 < 最小心跳包
}
else if ((dwCalc > g_nWebSocektHeartTime) && (dwCalc < g_nWebSocketLostConnectTime))
{
emit Msg_Self_HeartCmd();
}
else if(dwCalc > g_nWebSocketLostConnectTime)
{
qDebug() << QStringLiteral("连接超时!");
}
}
Sleep(1000); //每间隔1秒判断一次
}
return 0;
}
unsigned int QWebSocketManager::ThreadProcessingPCMData(void* pParam)
{
QWebSocketManager* pThis = reinterpret_cast<QWebSocketManager*>(pParam);
while (pThis->m_bRunningAudio == true)
{
//只有满足一个完整包数据时,才需要处理
if (pThis->m_ArrayAudio.count() >= m_nPeriodSize)
{
if (m_pAudioOutput->bytesFree() < m_nPeriodSize)
{
Sleep(5);
continue; //当前音频释放大小 < 固定大小时,不处理
}
std::lock_guard<std::mutex> lck(m_mutexPcm); //C11用法
QByteArray array = pThis->m_ArrayAudio.mid(0, m_nPeriodSize);
pThis->m_pStreamOutput->write(array);
pThis->m_ArrayAudio.remove(0, m_nPeriodSize);
qDebug() << QStringLiteral("处理一次完整的音频,此时剩余大小 = ") << pThis->m_ArrayAudio.count();
}
else
{
Sleep(1000);
}
}
return 0;
}
void QWebSocketManager::MsgReceived_Self_HeartCmd()
{
this->SendWebSocket_HeartCmd();
}
void QWebSocketManager::MsgRecievd_Server_Connected()
{
qDebug() << QStringLiteral("服务器,连接!");
emit Msg_Send_WebSocket_ConnectState(true);
m_bSendHeartCmd = true; //开启,心跳包线程,重置存储定时器的时间
}
void QWebSocketManager::MsgRecievd_Server_Disconnected()
{
qDebug() << QStringLiteral("服务器,断开连接!");
emit Msg_Send_WebSocket_ConnectState(false);
m_bSendHeartCmd = false; //关闭心跳包发送
}
void QWebSocketManager::MsgRecievd_Server_TextMessageReceived(const QString &message)
{
qDebug() << QStringLiteral("MsgRecievd_Server_TextMessageReceived,内容:") << message;
m_dwReciveTime = GetTickCount(); //更新接收时间
}
void QWebSocketManager::MsgRecievd_Server_BinaryMessageReceived(const QByteArray &message)
{
//qDebug() << QStringLiteral("MsgRecievd_Server_BinaryMessageReceived,内容:") << message;
m_dwReciveTime = GetTickCount(); //更新接收时间
{
std::lock_guard<std::mutex> lck(m_mutexPcm); //C11用法
m_ArrayAudio.append(message);
}
if (m_bRunningAudio == false)
{
m_bRunningAudio = true; //开启数据处理线程
m_threadAudio = std::thread(&QWebSocketManager::ThreadProcessingPCMData, this, this);
}
}
void QWebSocketManager::SendWebSocket_HeartCmd()
{
//qDebug() << QStringLiteral("发送一次心跳包!");
QString qsCmd = QStringLiteral("{\"type\":\"ping\"}");
m_pWebClient->sendTextMessage(qsCmd);
}
void QWebSocketManager::InitAudioOut()
{
QAudioFormat audio_out_format;
//设置录音的格式
audio_out_format.setSampleRate(8000); //采样率
audio_out_format.setChannelCount(1); //通道数
audio_out_format.setSampleSize(16);
audio_out_format.setCodec("audio/pcm"); //编码格式
audio_out_format.setByteOrder(QAudioFormat::LittleEndian); //样本是小端字节顺序
audio_out_format.setSampleType(QAudioFormat::SignedInt); //样本类型
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
m_pAudioOutput = new QAudioOutput(audio_out_format);
m_pStreamOutput = m_pAudioOutput->start();
m_nPeriodSize = m_pAudioOutput->periodSize();
qDebug() << QStringLiteral("当前音频完整数据格式大小是:") << m_nPeriodSize;
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt中使用QWebSocket与Web进行通讯,实时语音通话
共75个文件
dll:30个
qm:22个
cpp:3个
1星 需积分: 5 4 下载量 148 浏览量
2024-06-18
17:44:36
上传
评论
收藏 87.61MB ZIP 举报
温馨提示
开发环境:VS2017 + Qt 5.14.2 实现功能主要思路:在网页端进行语音输入,PC机可以实时接收并播放语音流。 此时,Qt程序做客户端,Web端做服务器,使用QWebSocket进行通讯,实时播放接收的语音流。 功能实现 想要实现该功能,需要完成以下两大部分。 第一部分:QWebSocket通讯实现。(简单) 第二部分:语音流实时播放功能。(稍微有点难度)
资源推荐
资源详情
资源评论
收起资源包目录
QtNetworkAudioTest.zip (75个子文件)
QtNetworkAudioTest
QtNetworkAudioTest.sln 1KB
.vs
QtNetworkAudioTest
v15
Browse.VC.opendb 38B
Browse.VC.db 44.09MB
.suo 43KB
ipch
AutoPCH
9ba3155e65a9799f
QWEBSOCKETMANAGER.ipch 124.31MB
100f59872b912e7b
QTNETWORKAUDIOTEST.ipch 131.31MB
x64
Debug
QtNetworkAudioTest.ilk 517KB
QtNetworkAudioTest.exe 79KB
QtNetworkAudioTest.pdb 1.82MB
QtNetworkAudioTest
QWebSocketManager.h 2KB
QtNetworkAudioTest.qrc 78B
QtNetworkAudioTest.ui 1KB
QtNetworkAudioTest.vcxproj.filters 2KB
QtNetworkAudioTest.vcxproj 5KB
QWebSocketManager.cpp 6KB
main.cpp 319B
x64
QtNetworkAudioTest.vcxproj.user 165B
QtNetworkAudioTest.h 483B
QtNetworkAudioTest.cpp 3KB
bin
audio_long8.pcm 1.66MB
bearer
qgenericbearer.dll 51KB
QtNetworkAudioTest.ilk 1.04MB
QtNetworkAudioTest.exe 167KB
styles
qwindowsvistastyle.dll 137KB
libGLESv2.dll 3.41MB
Qt5Gui.dll 6.8MB
imageformats
qjpeg.dll 411KB
qsvg.dll 30KB
qtga.dll 30KB
qtiff.dll 377KB
qwebp.dll 526KB
qgif.dll 37KB
qicns.dll 45KB
qwbmp.dll 29KB
qico.dll 37KB
Qt5Core.dll 5.91MB
Qt5Svg.dll 330KB
Qt5WebSockets.dll 158KB
Qt5Widgets.dll 5.34MB
audio
qtaudio_windows.dll 62KB
qtaudio_wasapi.dll 95KB
translations
qt_lv.qm 150KB
qt_sk.qm 132KB
qt_cs.qm 186KB
qt_de.qm 224KB
qt_ja.qm 141KB
qt_fi.qm 189KB
qt_da.qm 183KB
qt_ko.qm 141KB
qt_fr.qm 178KB
qt_pl.qm 171KB
qt_ar.qm 167KB
qt_it.qm 174KB
qt_bg.qm 175KB
qt_gd.qm 185KB
qt_es.qm 178KB
qt_en.qm 23B
qt_uk.qm 170KB
qt_zh_TW.qm 135KB
qt_ca.qm 194KB
qt_hu.qm 173KB
qt_he.qm 135KB
qt_ru.qm 208KB
iconengines
qsvgicon.dll 41KB
Qt5Multimedia.dll 724KB
platforms
qwindows.dll 1.4MB
QtNetworkAudioTest.pdb 2.71MB
libEGL.dll 23KB
opengl32sw.dll 19.95MB
Qt5Network.dll 1.32MB
D3Dcompiler_47.dll 3.98MB
playlistformats
qtmultimedia_m3u.dll 32KB
mediaservice
qtmedia_audioengine.dll 67KB
wmfengine.dll 210KB
dsengine.dll 303KB
共 75 条
- 1
资源评论
- yuyi201120112024-09-28不是QT代码工程,不要下载
糯诺诺米团
- 粉丝: 281
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功