【发布时间】:2015-11-10 01:32:33
【问题描述】:
我想播放实时声音响应,而不会明显滞后于用户交互。
为了降低延迟,我必须发送小块 pcm 数据。 我在做什么:
QAudioFormat format;
format.setSampleRate(22050);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning()<<"raw audio format not supported by backend, cannot play audio.";
return;
}
qAudioOutput = new QAudioOutput(format, NULL);
qAudioDevice=qAudioOutput->start();
以后
void Enqueue(TYPESAMPLEPCM *data,int countBytes){
while(qAudioOutput->bytesFree()<countBytes){
Sleep(1);
}
qAudioDevice->write((char *)data,countBytes);
}
数据块为 256 字节(128 个样本,“粒度”约为 6 毫秒。
Enqueue 从提供数据块的高优先级线程中的循环调用。那里没有延迟,因为它调用 Enqueue 的速度远远快于渲染音频数据。
但在我看来,存在缓冲区欠载的情况,因为声音在播放但有一种“噼啪”的常规噪音。
如果我将块大小增加到 256 个样本,问题几乎就消失了。开头只有一些噼啪声(?)
平台是 Windows 和 Qt 5.3。
这是正确的程序还是我遗漏了什么?
【问题讨论】:
-
Enqueue在哪里使用?谁叫它? -
Enqueue 从提供数据块的高优先级线程中的循环调用。那里没有延迟,因为它调用 Enqueue 的速度远远快于渲染音频数据。 (我会把这个添加到帖子中)
-
如果你打电话给
Sleep(1),怎么没有延迟?请编辑
标签: c++ qt audio streaming low-latency