我正在编写应用程序,它将语音从一台计算机发送到另一台计算机。我有一个简单的"sender“实现
VoiceSender::VoiceSender(QAudioFormat &format, QString ip){
input = new QAudioInput(format);
QUdpSocket* socket = new QUdpSocket();
socket->connectToHost(ip, 14433);
input->start(socket);
}只需从麦克风获取所有数据,并将其作为UDP发送到指定的IP即可。
另一边是程序,通过UDP接收到所有的数据,并通过音频系统进行播放
Interlocutor::Interlocutor(QAudioFormat &format){
socket = new QUdpSocket();
socket->bind(QHostAddress::Any, 14433);
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 Interlocutor::playData()
{
qDebug() << QDateTime::currentDateTime();
while (socket->hasPendingDatagrams())
{
QByteArray data;
data.resize(socket->pendingDatagramSize());
socket->readDatagram(data.data(), data.size());
device->write(data.data(), data.size());
}
}如果两台位于本地网络中的计算机都工作正常,我就可以在计算机之间传输语音。我试着在虚拟专用网中运行它。为此,我在两台计算机上都运行了Hamachi,但一无所获。从未调用过Slot playData()。我运行Wireshark,看到计算机得到了UDP包,但Qt没有。我应该怎么做才能修复它。
谢谢。
发布于 2014-09-28 18:36:10
您应该检查QUdpSocket::bind函数的结果。
布尔端口(常量QHostAddress & QUdpSocket::bind,quint16端口)
如果成功,则函数返回true,套接字进入BoundState;否则返回false。
if (!socket->bind(QHostAddress::Any, 14433))
{
QMessageBox::warning(0, "Error", "Binding Failed");
}如果绑定失败,请检查防火墙是否未阻止您或此端口是否未被其他应用程序使用。
https://stackoverflow.com/questions/26083598
复制相似问题