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

Posted

技术标签:

【中文标题】Qt 通过 TCP 套接字实时流式传输音频【英文标题】:Qt Stream Audio Over TCP Socket In Realtime 【发布时间】: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 而不是直接使用套接字?

【问题讨论】:

【参考方案1】:

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

我的类设计和你的有点不同,我有不同的socket类和音频类,你可以看到here。

【讨论】:

你不能发布你的项目吧?我将我的设置为 8192,但我没有得到任何东西...... 我添加了一个示例项目的链接

以上是关于Qt 通过 TCP 套接字实时流式传输音频的主要内容,如果未能解决你的问题,请参考以下文章

UWP物联网核心RTSP流媒体音频

如何使用套接字编程在两个 android 手机之间创建实时音频流..?

如何通过套接字或框架将音频从 iPhone 的麦克风流式传输到 Mac/PC?

节点(套接字)实时音频流/广播

在 Android 上使用 OpenSL ES 通过套接字通信流式传输 MP3 音频

将录制的音频从浏览器流式传输到服务器