2016-12-27 449 views
1

我正在尝试监视音频输入并将音频记录到文件,但只有当超过阈值时才会记录。在Qt中录制似乎有两个主要选项; QAudioRecorderQAudioInputQt:API将原始QAudioInput数据写入文件就像QAudioRecorder

长话短说:我试图找到可以从QAudioInput读取原始音频采样数据,并将其记录到文件中,就像QAudioRecorder这个API,但奇怪的是它似乎并不存在。举一个例子,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)我想在超过阈值之前及之前记录数据,而不是超过阈值之后。

+0

你解决了吗?我将尝试使用'QAudioSystemPlugin'制作虚拟音频设备。 – Velkan

+0

〜分类。我找到了一个适合我的折中解决方案。我会尽快将解释发布为答案。 – spinkus

回答

0

我结束了使用QAudioRecorder + QAudioProbe。有一对夫妇的限制,但:

首先附着QAudioProbe只有工作,如果QAudioRecorder实际上是记录,所以我只好在QAudioRecorder编写一个包装通过切换输出设备来开启/关闭记录|从actual_file |的/ dev /空值。

其次,正如我所说的“我想记录的数据在刚刚超过阈值之前,而不是超过阈值后”。那么,我必须妥协。探头用于检测记录条件,但无法将来自探头的数据填充到记录仪中。我的意思是,我猜你可以记录到处于空闲状态的缓冲区文件,并以某种方式预先部分数据......但复杂性对我来说并不值得。

Aside;有another issueQAudioRecorder,这促使我写一个包装它。基本上我发现QAudioRecorder::stop()有时会无限期挂起。为了解决这个问题,我不得不分配一台录音机并删除它,并用每个新录音启动一个新录音机。

+0

嗯,我根本没有音频设备...所以我需要更长的时间。 – Velkan