Во-первых, я пытаюсь отправить аудиоданные из одного процесса в другой через протокол UDP на localhost.Голосовой чат UDP на Qt
Во-первых, программа считывает голос с микрофона и отправляет его через гнездо 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, и я думаю, что данные передаются. Так много пакетов UDP в секунду на порту 1002.
Вторая программа должна прочитать пакеты 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. Что я делаю не так?
Пара вопросов: 1) В вашей второй программе, вы инстанцировании QApplication и призывающих app.exec() на нем? (Я предполагаю, что вы есть, но это не показано) Кроме того, просто из любопытства: почему частота дискретизации 128000? Это похоже на необычную частоту дискретизации аудио - более распространенные частоты дискретизации будут 44100, 48000, 96000 или 192000). –
Если вы посмотрите на [docs для QUdpSocket] (http://qt-project.org/doc /qt-5/QUdpSocket.html#details), вы можете видеть, что если вы используете слот для приема сигнала readyRead, вам нужно прочитать дейтаграмму или вы не получите больше дейтаграмм. Из документов: Примечание: входящую дейтаграмму следует читать, когда вы получаете сигнал readyRead(), иначе этот сигнал не будет испускаться для следующей дейтаграммы. –