Qt:用于将原始QAudioInput数据写入文件的API,就像QAudioRecorder一样

时间:2016-12-27 16:13:34

标签: qt

我正在尝试监听音频输入并将音频录制到文件中,但仅限于超出级别阈值时。在Qt中录制似乎有两个主要选项; QAudioRecorderQAudioInput

长话短说:我正在尝试找到可以从QAudioInput读取原始音频样本数据的API并将其记录到QAudioRecorder的文件中但奇怪的是它似乎并不存在。举一个例子,QAudioRecorder的设置类似于以下内容(但不是指定带有setAudioInput()的输入设备,而是传递它的采样字节):

QAudioEncoderSettings audioSettings;
QAudioRecorder recorder = new QAudioRecorder;
audioSettings.setCodec("audio/PCM");
audioSettings.setQuality(QMultimedia::HighQuality);
recorder.setEncodingSettings(audioSettings);
recorder.setContainerFormat("wav");
recorder.setOutputLocation(QUrl::fromLocalFile("/tmp/test.wav"));
recorder.setAudioInput("default");
recorder.record();

我正在使用QAudioInput,因为我需要访问原始样本。 QAudioInput的问题是,Qt似乎没有提供一种简单的方法来获取我从QAudioInput中获取的原始样本并将它们传输到沿途编码它们的文件中。 QAudioRecorder很好地做到了这一点,但你无法将原始样本提供给QAudioRecorder;你只需告诉它要记录哪个设备以及如何存储它。

注意我曾尝试使用QAudioInputQAudioRecorder - QAudioInput进行原始访问,QAudioRecorder每当我需要记录时,但有两个主要问题: A)其中只有一个可以一次读取给定的设备。 B)我想在超过阈值之前和之前记录数据,而不是在超过阈值之后记录数据。

1 个答案:

答案 0 :(得分:1)

我最终使用了QAudioRecorder + QAudioProbe。但是有一些限制:

首先,附加QAudioProbe仅在QAudioRecorder实际录制时才有效,因此我必须在QAudioRecorder上写一个包装器,通过将输出设备切换到from_text来打开/关闭录制|。的/ dev / null的

第二,正如我所说"我想在超过阈值之前和之前记录数据,而不是在超过阈值之后记录数据" 。好吧,我不得不妥协。探头用于检测记录条件,但无法将探头中的数据填回记录仪。我的意思是,我猜你可以记录到处于空闲状态的缓冲区文件,并以某种方式预先添加部分数据......但复杂性对我来说并不值得。

除了;有another issue QAudioRecorder促使我在上面写了一个包装器。基本上我发现QAudioRecorder::stop()有时会无限期地挂起。为了解决这个问题,我不得不分配一个记录器并将其删除,并在每次新记录时启动一个记录器。