Qt上的UDP语音聊天
UDP voice chat on Qt
首先,我试图通过本地主机上的UDP协议将音频数据从一个进程发送到另一个进程。
首先,程序从麦克风中读取语音,并通过UDP套接字发送:
#include <QApplication>
#include <QIODevice>
#include <QtMultimediaKit/QAudioOutput>
#include <QtMultimediaKit/QAudioInput>
#include <QtMultimediaKit/QAudioFormat>
#include <QUdpSocket>
int main(int argc, char** argv){
QApplication app(argc, argv);
QAudioFormat format;
format.setSampleRate(128000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioInput* input = new QAudioInput(format);
QUdpSocket* socket = new QUdpSocket();
socket->connectToHost("127.0.0.1", 1002);
input->start(socket);
return app.exec();
}
我检查了Wireshark发送的数据,我认为数据已经发送。1002端口上每秒有这么多UDP包。
第二个程序应该读取UDP包并在输出设备中播放:
#include "UDPPlayer.h"
#include <QDebug>
UDPPlayer::UDPPlayer(){
socket = new QUdpSocket();
socket->bind(1002);
QAudioFormat format;
format.setSampleRate(128000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
output = new QAudioOutput(format);
connect(socket, SIGNAL(readyRead()), this, SLOT(playData()));
}
void UDPPlayer::playData(){
qDebug() << "data";
output->start(socket);
}
问题如下:从未调用playData()
(从未打印"数据")。这是否意味着套接字永远不是readyRead
?但我看到了Wireshark的这些包裹。我做错了什么?
您需要确保输入和输出设备支持所使用的格式。
您还需要从输出设备创建一个QIODevice
,以便向其写入数据,这样的数据将通过socket->readDatagram()
获得
你需要做这样的事情:
main.cpp:
#include <QApplication>
#include <QIODevice>
#include <QtMultimedia/QAudioOutput>
#include <QtMultimedia/QAudioInput>
#include <QtMultimedia/QAudioFormat>
#include <QUdpSocket>
#include "udpplayer.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
new UDPPlayer();
QAudioFormat format;
format.setSampleRate(128000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
//If format isn't supported find the nearest supported
QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice());
if (!info.isFormatSupported(format))
format = info.nearestFormat(format);
QAudioInput* input = new QAudioInput(format);
QUdpSocket* socket = new QUdpSocket();
socket->connectToHost("127.0.0.1", 1002);
input->start(socket);
return a.exec();
}
udpplayer.h:
#include <QObject>
#include <QtMultimedia/QAudioOutput>
#include <QtMultimedia/QAudioInput>
#include <QtMultimedia/QAudioFormat>
#include <QUdpSocket>
class UDPPlayer : public QObject
{
Q_OBJECT
public:
explicit UDPPlayer(QObject *parent = 0);
private slots:
void playData();
private:
QAudioOutput *output;
QUdpSocket *socket;
QIODevice *device;
};
udpplayer.cpp:
UDPPlayer::UDPPlayer(QObject *parent) : QObject(parent)
{
socket = new QUdpSocket();
socket->bind(1002);
QAudioFormat format;
format.setSampleRate(128000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format))
format = info.nearestFormat(format);
output = new QAudioOutput(format);
device = output->start();
connect(socket, SIGNAL(readyRead()), this, SLOT(playData()));
}
void UDPPlayer::playData()
{
//You need to read datagrams from the udp socket
while (socket->hasPendingDatagrams())
{
QByteArray data;
data.resize(socket->pendingDatagramSize());
socket->readDatagram(data.data(), data.size());
device->write(data.data(), data.size());
}
}
相关文章:
- 从udp接收帧对于人脸识别来说太慢
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- boost::asio UDP 广播客户端仅接收"fast"数据包
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- 动态分配的聊天数组打印缺失的数据和空
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 发送固定大小的 UDP 数据包
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 使用 UDP 中断 while()-循环
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 具有使用 UDP 套接字字节的限制的标头
- 在 Linux 中关闭 UDP 套接字后,recv 不会返回
- 提升::Asio 异步聊天客户端停止与服务器通信
- 如何在桌面应用程序中使用WEBRTC进行语音聊天
- 在C++/Qt中的UDP服务器客户端聊天
- 在C++中创建基本的UDP聊天程序
- Qt上的UDP语音聊天
- google ProtoBuf在c++上与ProtoBuf -net在c# (UDP)上聊天