C读取wav文件,subchunk1size = 18

weixin_38080567 2019-09-12 01:57:15
通常wav文件的subchunk1size是16.但是,我有一些wav文件有subchunk1size = 18.我有c代码来读取有subchunk1size = 16的wav文件.现在我想读取subchunk1size = 18的wav文件.任何帮助,将不胜感激. typedef struct header_file { char chunk_id[4]; int chunk_size; char format[4]; char subchunk1_id[4]; int subchunk1_size; short int audio_format; short int num_channels; int sample_rate; int byte_rate; short int block_align; short int bits_per_sample; char subchunk2_id[4]; int subchunk2_size; } header; 以上是我的代码中的struct header_file,用于读取带有subchunk1size = 16的wav文件.
...全文
126 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38123300 2019-09-12
  • 打赏
  • 举报
回复
Wav文件没有您期望的那样严格的结构. “fmt”块不一定是第一个跟随文件头的(虽然它通常是),并且它的大小不一定是16个字节(尽管通常情况也是这样).压缩音频可以存储在wav文件中,在这种情况下,audio_format字段将不同于1,并且“fmt”块可以具有不同于16字节的大小. 解析wav文件的正确而灵活的方法是使用更细粒度的结构: struct wave_header { char chunk_id[4]; int chunk_size; char format[4]; }; struct riff_chunk_header { char id[4]; int size; }; struct wave_fmt_chunk { short audio_format; short num_channels; int sample_rate; int byte_rate; short block_align; short bits_per_sample; }; 然后你的解析逻辑应该是(注意验证你在每一步读取的数据): >阅读wave_header>阅读riff_chunk_header>如果您读取的块头的ID不是“fmt”,则跳过块(您的大小以字节为单位)并循环回到步骤2以读取下一个块头>阅读audio_format字段>根据此audio_format解释“fmt”块的其余数据.如果它为1,则表示您有PCM数据,并且该块应该具有您预期的16个字节.如果不是1,则必须找到有关该压缩格式的文档. 一般来说,优雅地忽略其他数据也是一个好主意,因此如果你确实看到一个带有18字节“fmt”块的PCM编码的wav文件,请尝试忽略最后2个字节并查看它的位置.

430

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧