【问题标题】:playing wav audio file in C++ and QT在 C++ 和 QT 中播放 wav 音频文件
【发布时间】:2012-10-14 20:32:12
【问题描述】:

我正在读取 C 中的 .wav 文件,然后尝试使用一些 QT 函数播放音频文件。这是我读取文件的方式:

FILE *fhandle=fopen("myAudioFile.wav","rb");
fread(ChunkID,1,4,fhandle);
fread(&ChunkSize,4,1,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk1Size,4,1,fhandle);
fread(&AudioFormat,2,1,fhandle);
fread(&NumChannels,2,1,fhandle);
fread(&SampleRate,4,1,fhandle);
fread(&ByteRate,4,1,fhandle);
fread(&BlockAlign,2,1,fhandle);
fread(&BitsPerSample,2,1,fhandle);
fread(&Subchunk2ID,1,4,fhandle);
fread(&Subchunk2Size,4,1,fhandle);
Data=new quint16 [Subchunk2Size/(BitsPerSample/8)]; 
fread(Data,BitsPerSample/8,Subchunk2Size/(BitsPerSample/8),fhandle); 
fclose(fhandle);

所以我的音频文件在Data 中。 Data 的每个元素都是无符号的 16 位整数。

为了播放声音,我将每个 16 位无符号整数分成两个字符,然后每 3 毫秒(使用计时器)向声卡发送 256 个字符。 假设myData 是一个包含 256 个字符的字符数组,我这样做(每 3 毫秒)来播放声音:

m_output->write(myData, 256);

另外m_output定义为:

m_output = m_audioOutput->start();

m_audioOutput定义为:

m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this); 

并且音频格式正确设置为:

m_format.setFrequency(44100); 
m_format.setChannels(2);
m_format.setSampleSize(16);
m_format.setSampleType(QAudioFormat::UnSignedInt ); 
m_format.setByteOrder(QAudioFormat::LittleEndian);
m_format.setCodec("audio/pcm");

但是,当我尝试运行代码时,我听到了一些与真实音频文件非常不同的噪音。 是不是我做错了什么?

谢谢, TJ

【问题讨论】:

  • 你用的是什么定时器?
  • 您以这种方式阅读文件有什么特别的原因吗?否则,您可以使用简单的方法: QSound::play("myAudioFile.wav") 或更好地使用 QAudioOutput 读取 QFile 作为文档建议。
  • @Anthony:我使用什么类型的计时器有关系吗?
  • @LucaCarlon:我想在直接播放音频之前做一些信号处理。我播放音频的方式有什么问题吗?
  • 这很重要,因为如果计时器不准确,那么您的方法将导致声音混乱。让事情发生在三(或任何其他数量)毫秒内真的很难。

标签: c++ qt audio wav


【解决方案1】:

我认为问题在于您使用的是 QTimer。无论您使用什么平台,QTimer 绝对不允许您精确地每三毫秒运行一次代码。如果你只偏离了一个样本,你的音频听起来会很糟糕。根据QTimer docs

...不能保证它们在指定的确切值处超时。在 在许多情况下,它们可能会延迟一段时间 取决于系统计时器的准确性。

...在许多实际情况下,计时器的精度不会等于 [1 ms]。

尽管我很喜欢 Qt,但我不会尝试将它用于信号处理。我会使用另一个框架,例如JUCE

【讨论】:

  • 我猜你是对的,什么是最稳定的计时器? juce有准确的计时器吗?
  • 我不认为定时器是信号处理的方式。你不应该去那么低的水平。无论如何,我会看看 JUCE 和 here(使用 JUCE 的 DSP 类的集合)。我也强烈推荐PD。它非常简单且功能强大。
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多