我正在编写应用程序,它将语音从一台计算机发送到另一台计算机。我简单地实现了" 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());
}
}
如果两台计算机都位于本地网络中,这种方法运行良好,我可以在计算机之间传输语音。我试图在VPN中运行它。为此,我在两台计算机上运行Hamachi,什么也没得到。永远不会调用Slot playData()。我运行Wireshark并看到计算机获得UDP包,但Qt没有。我该怎么做才能解决它。
感谢。
答案 0 :(得分:0)
您应该检查QUdpSocket :: bind函数的结果。
bool QUdpSocket::bind(const QHostAddress&amp; address,quint16 port)
成功时,函数返回true并进入套接字 BoundState;否则返回false。
if (!socket->bind(QHostAddress::Any, 14433))
{
QMessageBox::warning(0, "Error", "Binding Failed");
}
如果绑定失败,请检查防火墙是否阻止您,或者该端口未被其他应用程序使用。