代码之家  ›  专栏  ›  技术社区  ›  Belphegor

WAV文件中的“ChunkSize”

  •  2
  • Belphegor  · 技术社区  · 6 年前

    我目前正在查看以下WAV文件的信息,我发现了WAV文件头中包含的“ChunkSize”。然而,我无法理解ChunkSize的值是如何计算的。根据

    http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf

        36 + SubChunk2Size, or more precisely: 
                               4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) 
                               This is the size of the rest of the chunk  
                               following this number.  This is the size of the 
                               entire file in bytes minus 8 bytes for the 
                               two fields not included in this count: 
                               ChunkID and ChunkSize.  
    

    我已经看了大约40分钟了,我不明白这些数字是从哪里来的。例如,“4”是从哪里来的,而“8”是从哪里来的?

    2 回复  |  直到 6 年前
        1
  •  3
  •   tonys    6 年前

    根据你的第一张图表 WavFormatDocs 链接,ChunkSize是 Format , SubChunk1ID + SubChunk1Size + SubChunk1 SubChunk2ID + SubChunk2Size + SubChunk2 领域:

    Format:                              4 bytes
    SubChunk1ID + SubChunk1Size: 4 + 4 = 8 bytes
    SubChunk1:                           <SubChunk1Size> bytes
    SubChunk2ID + SubChunk2Size: 4 + 4 = 8 bytes
    SubChunk2:                           <SubChunk2Size> bytes
                                         ---------------------------------------------------
                                         4 + (8 + SubChunk1Size) + (8 + SubChunk2Size) bytes
    

    这个 fmt 区块大小是固定的:

    SubChunk1ID:   4  bytes 
    SubChunk1Size: 4  bytes 
    SubChunk1:     16 bytes
                   --------
                   24 bytes
    

    所以 ChunkSize 是:

    Format:         4 bytes 
    fmt chunk:     24 bytes 
    SubChunk2ID:    4 bytes 
    SubChunk2Size:  4 bytes
    SubChunk2:     <SubChunk2Size> bytes
                   ---------------------
                   36 + <SubChunk2Size> bytes
    
        2
  •  0
  •   Tonecops    2 年前

    第二个设计错误是ChunkSize字段。或者是因为历史原因。也许他们在格式演变的早期并没有想到会添加多个块。我根本不需要使用ChunkSize,只需要通过验证它是否存在并检查其值是否正确来计算它。同一个术语“块大小”后来在格式中以有意义的方式使用。 我的代码中的ChunkSize是“文件长度-8”。如果不是,则抛出异常。 它可以被描述为“wav文件知道自己的大小”。