首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sox生成的不正确wav报头

sox生成的不正确wav报头
EN

Stack Overflow用户
提问于 2018-06-26 02:42:13
回答 1查看 3.3K关注 0票数 2

我使用sox将两个通道,48000 to,24位wav文件(new.wav)转换为一个单wav文件(post.wav)。以下是相关的命令和输出:

代码语言:javascript
复制
[Farmer@Ubuntu recording]$ soxi new.wav 
Input File     : 'new.wav'
Channels       : 2
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:01.52 = 72901 samples ~ 113.908 CDDA sectors
File Size      : 447k
Bit Rate       : 2.35M
Sample Encoding: 24-bit Signed Integer PCM

[Farmer@Ubuntu recording]$ sox new.wav -c 1 post.wav 
[Farmer@Ubuntu recording]$ soxi post.wav 

Input File     : 'post.wav'
Channels       : 1
Sample Rate    : 48000
Precision      : 24-bit
Duration       : 00:00:01.52 = 72901 samples ~ 113.908 CDDA sectors
File Size      : 219k
Bit Rate       : 1.15M
Sample Encoding: 24-bit Signed Integer PCM

看上去很好。但是,让我们检查一下post.wav的头:

代码语言:javascript
复制
[Farmer@Ubuntu recording]$ xxd post.wav | head -10
00000000: 5249 4646 9856 0300 5741 5645 666d 7420  RIFF.V..WAVEfmt 
00000010: 2800 0000 feff 0100 80bb 0000 8032 0200  (............2..
00000020: 0300 1800 1600 1800 0400 0000 0100 0000  ................
00000030: 0000 1000 8000 00aa 0038 9b71 6661 6374  .........8.qfact
00000040: 0400 0000 c51c 0100 6461 7461 4f56 0300  ........dataOV..

这是标准wav文件头结构

第一行没问题。

第二行"2800 0000“显示子块"fmt”的大小,应该是0x00000028 (因为这是小endian) =40个字节。但是有54个字节(在子块"fmt“和子块”数据“之前)。

第三行显示"ExtraParamSize“为0x0018 =22个字节。但实际上是36个字节(从第三行的"1600“到第5行的"0100")。前16个字节是标准的。

那么额外的36个字节是多少呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-02 05:22:48

好吧,我找到答案了。

看第二行,我们可以发现音频格式是"feff",实际值是0xFFFE,所以这不是PCM标准的波形格式,而是可扩展的格式。

Wav头详细介绍可参考此链接。这篇文章写得很好,多亏了作者。

因此,由于这是一个非PCM格式的wav,"fmt“块空间占40个字节没有问题,后面跟着一个”事实“块,然后是”数据“块,所以一切都是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51034165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档