Qt流音频通过TCP套接字实时

Dav*_*wig 7 sockets audio qt stream

我试图弄清楚如何通过Qt中的TCP套接字实时传输音频.我正在使用的是QAudioInput客户端和QAudioOutput服务器上的.两者都使用以下格式:

QAudioFormat format;
format.setChannelCount(1);
format.setSampleRate(8000);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
Run Code Online (Sandbox Code Playgroud)

我已经有一个简单的套接字服务器设置,并设法使用以下方法将音频从客户端流式传输到服务器:

//client
QAudioInput *audio = new QAudioInput(format, this);
audio->setBufferSize(1024);
audio->start(socket);


//server
QAudioOutput *audio = new QAudioOutput(format, this);
audio->setBufferSize(1024);
Run Code Online (Sandbox Code Playgroud)

然后在服务器上我收到数据并将其附加到 QByteArray

在服务器上,我创建一个QBufferQByteArray在客户端关闭后给它,然后像这样播放它:

QByteArray *data = new QByteArray();

while(1)
{
    if(socket->waitForReadyRead(30000))
        data->append(socket->readAll());
    else
        break;
}

QBuffer *buffer = new QBuffer(data);
QEventLoop *loop = new QEventLoop(this);
buffer->open(QIODevice::ReadOnly);
audio->start(buffer);

loop->exec();
Run Code Online (Sandbox Code Playgroud)

这将在客户端关闭后播放整个流.我正在寻找的是修改服务器以实时播放它,但我无法弄清楚如何.我已经接近实时但它在数据包之间有很大的点击,并且延迟了几秒钟.

我试过像我以前发送它一样播放流:

audio->start(socket);
Run Code Online (Sandbox Code Playgroud)

但这没有做任何事情.也许如果我使用QDataStream而不是直接使用套接字?

Ant*_*ias 10

为了解决这个问题,我只是将setBufferSize你的1024增加到更高的值,例如我使用了8192,这样你就有机会让设备一次读取更多数据,并且我能够传输音频我的无线网络.

我的班级设计与你的有点不同,我有不同的插座和音频课程,你可以在这里看到它.