我正在学习如何在C++中读取WAV文件,并根据标题提取数据。我周围有一些WAV文件。通过查看所有文件的标题,我发现它们都遵循wave文件的规则。但是,由TeamSpeak产生的文件录音很奇怪,但仍可以在媒体播放器中播放。
因此,查看WAV文件的标准格式,如下所示:
因此,在所有看起来正常的文件中,我会从“AudioFormat”到“BitsPerSample”(从图片中)获得所有值的合法值。但是,在TeamSpeak文件中, ALL 这些值恰好是零。
这,但前三个值不为零。因此,第一个和第三个字符串中有“RIFF”和“WAVE”,并且ChunkSize似乎合法。
所以我的问题是:播放器如何知道有关此文件的任何信息并认识到该文件是单声道还是立体声?采样率?有什么事吗当所有这些值都为零时,是否有某种可以假设的标准?
更新
我用MediaInfo检查了文件并得到了:
General
Complete name : ts3_recording_16_10_02_17_53_54.wav
Format : Wave
File size : 2.45 MiB
Duration : 13 s 380 ms
Overall bit rate mode : Constant
Overall bit rate : 1 536 kb/s
Audio
Format : PCM
Format settings, Endianness : Little
Format settings, Sign : Signed
Codec ID : 1
Duration : 13 s 380 ms
Bit rate mode : Constant
Bit rate : 1 536 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Bit depth : 16 bits
Stream size : 2.45 MiB (100%)
仍然不明白它是如何得出这些结论的。
最佳答案
在使用带有WAV二进制模板的十六进制编辑器检查文件之后,很明显在“fmt”之前有一个附加的“JUNK”块(附有屏幕截图)。 JUNK块可能出于某些填充原因而存在,但其所有值均为0。您需要在代码中查找(可能是fseek)wav文件,以查找首次出现的“fmt”字节,并从此处解析WAVEFORMATEX信息。
关于c++ - 所有规范均为 “0”时的默认WAV描述,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39819024/