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

时间:2014-08-26 05:14:59

标签: qt sockets audio 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);

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

//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 个答案:

答案 0 :(得分:10)

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

我的班级设计与你的班级设计略有不同,我有不同的插座和音频课程,你可以看到它here