所有规格为“0”时的默认 WAV 描述
Posted
技术标签:
【中文标题】所有规格为“0”时的默认 WAV 描述【英文标题】:Default WAV description when all specs are "0" 【发布时间】:2016-10-02 16:17:40 【问题描述】:我正在学习如何在 C++ 中读取 WAV 文件,并根据标题提取数据。我有一些 WAV 文件。通过查看所有文件的标题,我看到它们都遵循波形文件的规则。但是,TeamSpeak 制作的文件录制很奇怪,但它们仍然可以在媒体播放器中播放。
所以看WAV文件的标准格式是这样的:
因此,在所有看起来正常的文件中,我得到了从“AudioFormat”到“BitsPerSample”(来自图片)的所有值的合法值。但是,在 TeamSpeak 文件中,ALL 这些值正好是零。
这个,但前 3 个值不为零。所以第一个和第三个字符串中有“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 文件会被压缩。 @VuVirt 实际上,由于许多原因,它看起来并没有被压缩。首先,文件真的很大。检查我提供的样品。这就像 13 秒,大小为 2.5 MB。其次,我可以使用 libmp3lame 将其转换为 mp3,它通常不会解码任何内容,只是读取 PCM 样本 (AFAIK)。 www-mmsp.ece.mcgill.ca/documents/audioformats/wave/wave.html 我认为 libmp3lame 会解码 mp3。我还认为您需要按照上述链接检查 SubFormat。 @VuVirt 谢谢。让我在这里阅读并报告。 【参考方案1】:在使用带有 WAV 二进制模板的十六进制编辑器检查您的文件后,很明显在“fmt”之前有一个额外的“JUNK”块(附上截图)。 JUNK 块可能由于某些填充原因而存在,但它的所有值都是 0。您需要在代码中查找(可能是 fseek)wav 文件以查找“fmt”字节的第一次出现,并从那里解析 WAVEFORMATEX 信息。
【讨论】:
以上是关于所有规格为“0”时的默认 WAV 描述的主要内容,如果未能解决你的问题,请参考以下文章