【发布时间】:2014-10-19 08:20:09
【问题描述】:
我试图弄清楚如何通过 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 而不是直接使用套接字?
【问题讨论】: