2014-09-07 6 views
0

Во-первых, я пытаюсь отправить аудиоданные из одного процесса в другой через протокол 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. Что я делаю не так?

+0

Пара вопросов: 1) В вашей второй программе, вы инстанцировании QApplication и призывающих app.exec() на нем? (Я предполагаю, что вы есть, но это не показано) Кроме того, просто из любопытства: почему частота дискретизации 128000? Это похоже на необычную частоту дискретизации аудио - более распространенные частоты дискретизации будут 44100, 48000, 96000 или 192000). –

+0

Если вы посмотрите на [docs для QUdpSocket] (http://qt-project.org/doc /qt-5/QUdpSocket.html#details), вы можете видеть, что если вы используете слот для приема сигнала readyRead, вам нужно прочитать дейтаграмму или вы не получите больше дейтаграмм. Из документов: Примечание: входящую дейтаграмму следует читать, когда вы получаете сигнал readyRead(), иначе этот сигнал не будет испускаться для следующей дейтаграммы. –

ответ

2

Вам необходимо убедиться, что используемый формат поддерживается устройствами ввода и вывода.

Кроме того, необходимо создать QIODevice от устройства вывода, чтобы записать данные на него, такие данные, которые вы получите с socket->readDatagram()

И вам нужно сделать что-то вроде этого:

основной. каст:

#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()); 
    } 
} 
+0

Я делаю голосовой чат, который работает на двоих, слушайте и говорите, но у меня есть проблема. Я задал свой вопрос здесь, возможно, вы посмотрите на него, пожалуйста, и я вижу ваш проект, чтобы получить хаб, и он работает как на Android, так и на окнах, но как сделать это двумя способами http://stackoverflow.com/questions/38818872/voice-not-clear-in-voice-chat-using-qt-android – 2016-08-20 14:04:18

Смежные вопросы