当前位置: 首页 > 知识库问答 >
问题:

在C和QT中播放wav音频文件

王飞英
2023-03-14

我正在读一本书。wav文件在C中,然后我尝试使用一些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_输出定义为:

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

共有1个答案

胡高寒
2023-03-14

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

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

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

尽管我非常喜欢Qt,但我不会试图将其用于信号处理。我会使用另一个框架,如JUCE。

 类似资料:
  • 我无法从sd卡播放wav音频文件: 这是我的代码: 文件名路径的格式为:/storage/emulated/0/MyApp/name。wav 这是我得到的错误代码: 我希望你能帮我? 谢谢

  • 我将从REST服务接收非常短的音频数据。它们将以WAV格式到达。然后我需要在Android设备上播放它们。我想在不将数据保存到文件的情况下完成这项工作——这只会让它变得比需要的更复杂。然而,我无法从内存流让它工作。下面是我正在使用的测试代码(使用assets文件夹中的.wav文件): 当我从文件中播放它时,它是好的,但是内存流方法给了我一个IO异常准备失败错误。我怀疑问题可能是音频/wav值。我找

  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。

  • 问题内容: 如何在Java应用程序中播放和文件?我正在使用。我尝试在互联网上查找类似以下示例的内容: 但是,这只会播放文件。 问题答案: 如何在Java应用程序中播放和文件?我正在使用。我尝试在互联网上查找类似以下示例的内容: 但是,这只会播放文件。

  • 问题内容: 我正在寻找一种轻松播放远程 .mp3 文件的解决方案。我看过适用于本地文件的“ pyglet”模块,但似乎无法处理远程文件。我可以临时下载 .mp3 文件,但是由于 .mp3 文件看起来太大,因此不建议这样做。 我宁愿它用于跨平台而不是仅用于Windows等。 例如,播放来自以下位置的音频文件: http://example.com/sound.mp3 只需在下载文件时流式传输文件,我

  • 我通过谷歌阅读about.wav文件格式,我所能想到的是帧是由样本(一些定义的位深度)组成的,而wav立体声文件有多个叫做通道的东西......混乱的是一个通道是否由帧组成?当我播放一些音频文件时,所有通道都一起播放吗?如果一个通道由帧组成,所有通道的长度是否相等(位明智)?如果有人可以,请回答,当以波形播放wav文件时,我必须分别显示每个通道