- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试每 20 毫秒写入一次 QAudioOutput 的缓冲区。当我尝试执行此代码时,我可以看到进程的大小每秒增加约 4-8 kB。我试图找到一些函数来清除 QIODevice 或 DAudioOuptut 的内部缓冲区,但没有成功。
我正在使用 Qt 5.2.1
在下面的例子中只写了silence(zeros)但是它有同样的效果:
#include <QLibraryInfo>
#include <QtCore/QCoreApplication>
#include <windows.h> // for Sleep
#include <QAudioOutput>
#include <QAudioDeviceInfo>
#include <QAudioFormat>
#include <array>
class QAudioOutput;
int main(int argc, char *argv[])
{
// Create QApplication
QCoreApplication app(argc, argv);
app.setApplicationName("Audiotest");
//Initialize device
QIODevice * _output;
QAudioDeviceInfo _device = QAudioDeviceInfo::defaultOutputDevice();
QAudioFormat _format;
_format.setSampleRate(44100);
_format.setChannelCount(2);
_format.setSampleSize(16);
_format.setCodec("audio/pcm"); // This codec should be supported on all platforms and plugin implementation
_format.setByteOrder(QAudioFormat::LittleEndian);
_format.setSampleType(QAudioFormat::SignedInt);
if (!_device.isFormatSupported(_format)) {
printf("Default format not supported - trying to use nearest.\n");
_format = _device.nearestFormat(_format);
}
QAudioOutput * _audioOutput = new QAudioOutput(_device, _format);
_output = _audioOutput->start();
std::array<char, 32768> _buffer;
_buffer.fill(0);
for (;;) {
const int periodSize = _audioOutput->periodSize();
const int chunks = _audioOutput->bytesFree() / periodSize;
for (int i = 0; i < chunks; ++i) {
const qint64 len = periodSize;
if (len && _output) {
_output->write(_buffer.data(), len);
}
if (len != periodSize) {
break;
}
}
Sleep(20);
}
return 0;
}
最佳答案
当你的循环运行时,没有其他事情发生。您的代码应该是异步的,并且您应该反转控制流。对音频输出设备的通知作出 react ,它已经处理了一定间隔的样本。
要接收第一个通知,您需要为设备准备一些数据。
// https://github.com/KubaO/stackoverflown/tree/master/questions/audio-37993427
#include <QtMultimedia>
#include <array>
int main(int argc, char ** argv) {
QCoreApplication app{argc, argv};
auto device = QAudioDeviceInfo::defaultOutputDevice();
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
if (!device.isFormatSupported(format))
qFatal("Default format not supported");
QAudioOutput audioOutput{device, format};
auto output = audioOutput.start();
qDebug() << audioOutput.state();
std::array<char, 32768> buffer;
buffer.fill(0);
auto write = [&]{
qDebug() << "notify";
auto periodSize = audioOutput.periodSize();
auto chunks = audioOutput.bytesFree() / periodSize;
for (int i = 0; i < chunks; ++i) {
if (periodSize && output) {
auto len = output->write(buffer.data(), periodSize);
if (len != periodSize)
break;
}
}
};
audioOutput.setNotifyInterval(20);
QObject::connect(&audioOutput, &QAudioOutput::notify, write);
write();
return app.exec();
}
关于c++ - QAudioOutput - 应用程序大小不断增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37993427/
我有一个关于使用 QAudioOutput 以特定采样率直接将样本写入声音输出设备的问题。我正在编写一个模拟器,以每帧为基础模拟声音芯片,然后获取一个包含一帧音频样本的缓冲区,我想将其写入音频输出。目
我正在尝试每 20 毫秒写入一次 QAudioOutput 的缓冲区。当我尝试执行此代码时,我可以看到进程的大小每秒增加约 4-8 kB。我试图找到一些函数来清除 QIODevice 或 DAudio
我正在像这样在 QThread 中播放音频流: // Setup QAudioFormat format; format.setFrequency(44100); format.setChannels
我正在开发一个 C++ 项目,使用它自己的 C++ API 从麦克风阵列系统读取/处理/播放原始音频。我正在使用 Qt 对软件进行编程。 来自这篇关于 Real Time Streaming With
我正在尝试使用 QAudioOutput 和“原始格式”的 wav 来播放声音。计时器超时后(每 50 毫秒)我执行以下操作: QByteArray TempSBuffer; short int *h
我在 Windows 7 Ultimate x64 上使用 Qt 4.8 和 Qt Creator 2.4.1。 我正在使用 QAudioInput 类获取音频输入并使用 QAudioOutput 播
我想播放实时声音以响应用户交互而没有明显的延迟。 为了低延迟,我必须发送小块的 pcm 数据。我在做什么: QAudioFormat format; format.setSampleR
我想用 QtMultimedia 播放声音. 在 QMediaPlayer 的情况下,我可以播放 mp3 文件,它是由 gTTS 制作的。 (我认为没关系,但我不喜欢文件保留,除非我执行删除它的代码。
我想使用 QAudioOutput 将音频文件播放到指定的设备。 .wav 文件没问题。但是播放.mp3文件时有嗡嗡声(我知道.mp3文件是压缩文件,所以QAudioOutput不能直接播放)。 我正
我有一个从QObject派生的类,该类在QByteArray中有一堆串联的WAVE文件作为成员变量。 我想通过QAudioOuput播放该数组中的特定文件(假设我具有它的偏移量)。 这是PlaySou
我是一名优秀的程序员,十分优秀!