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

8
我正在尝试在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);

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

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


//server
QAudioOutput *audio = new QAudioOutput(format, this);
audio->setBufferSize(1024);

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

在服务器上,我创建了一个QBuffer,将其赋给QByteArray,一旦客户端关闭,就像这样播放:

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();

这将在客户端关闭后播放整个流。我想要的是修改服务器以实时播放,但我无法弄清楚如何做到。我已经接近实时了,但数据包之间有很大的噪音,并且会有几秒钟的延迟。
我尝试像以前发送流一样播放它:
audio->start(socket);

但是这并没有起到任何作用。也许如果我使用QDataStream而不是直接使用套接字会更好?

1个回答

10
为了解决这个问题,我只需要将setBufferSize从你的1024增加到更高的值,例如我使用了8192,这样你就有机会让设备一次读取更多的数据,我就能够通过无线网络流式传输音频了。
我的类设计与你的略有不同,我有不同的套接字和音频类,你可以在这里看到。

你不能发布你的项目吗?我把我的设置为8192,但是我什么也没有得到... - David Ludwig
1
我已经添加了一个示例项目的链接。 - Antonio Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接