2012-08-15 87 views
3

我试图读取的ffmpeg生成的wav文件与读wav文件,计算FO持续时间/ DATA_SIZE总是错误

的ffmpeg -i AV

FFmpeg的产生与18的报头尺寸的wav文件,但没有任何扩展数据。

这是我的数据结构:

struct wav_header { 
    uint32_t chunk_id; 
    uint32_t chunk_data_size; 
    uint32_t riff_type; 
    uint32_t fmt; 
    uint32_t fmt_chunk_size; 
    uint16_t format_tag; 
    uint16_t channels; 
    uint32_t samples_per_second; 
    uint32_t bytes_per_second; 
    uint16_t block_align;   /* 1 => 8-bit mono, 2 => 8-bit stereo or 16-bit mono, 4 => 16-bit stereo */ 
    uint16_t bits_per_sample; 
}; 

struct fact_header { 
    uint32_t chunk_id; 
    uint32_t chunk_data_size; 
    uint32_t sample_length; 
}; 

struct data_header { 
    uint32_t id; 
    uint32_t size; 
}; 

如果我读出来让我的wav文件的结果如下:

chunk_data_size: 40836134 

ftm_chunk_size: 18 
channels: 2 
samples_per_second (samplerate): 48000 
bytes_per_second: 192000 
block_align: 4 
bits_per_sample: 16 

data_id: 61746164 -> 'data' OK 
data_size: 40836096  

我现在尝试通过计算以秒为单位的长度式

data_size/bytes_per_second 

,并得到以下输出:

length_in_seconds: 212.68800354 
length_in_minutes: 3.54480004 (length_in_seconds/60) 

但是,当我打开我的文件在iTunes中,我得到了3:31的长度。我也试过用其他声音文件,我总是有点太过分。

我也试过,是hexdump我的wav文件。这个hexdump显示的输出比我为 (data_size; i + = 2)printf(“%02x”,data [i])要低,所以我不知道怎么读得太远?

我搜索了关于公式的整个互联网,但我还是坚持住了,因为我总是得到相同的结果。

http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/wave.html

你可以仔细阅读以下声明:

“WAVE文件通常有之前或之后的声音数据(数据块)信息块某些程序(天真),假设用于PCM数据,文件头长度只有44个字节,文件的其余部分包含声音数据,这不是一个安全的假设。“

这可能是我做错了。但是,我怎么才能得到正确的sound_chuck_data_size?

编辑

LILE GCB指出下面一切正常。该解决方案是,当时被存储在十进制时间,我不得不将其转换为常规时间:-)这是我想出了,它工作正常:

track.duration_dec = (float)data.size/(header.bytes_per_second * 60); 
track.duration_time = convert_time(track.duration_dec); 


static double convert_time(double input) { 
    double integral; 
    double frac; 
    char buffer[48]; 
    frac = modf(input, &integral); 
    sprintf(buffer, "%d.%1.f", (int)integral, frac*60); 
    return atof(buffer); 
} 
+3

关于以分钟为单位的长度,请记住您显示_decimal_数字,以便0.5分钟为半分钟(即30秒)。 – 2012-08-15 09:27:42

+0

文件系统上的wav文件大小是多少? – CyberDem0n 2012-08-15 09:29:59

回答

3

这听起来挺合我意。所以你的歌是3.54480004。如前所述,这是十进制。所以你有3分钟,然后是0.54480004 * 60这是33.28秒。所以我会说3.33分钟长

+0

OMG :-)感谢:D – 2012-08-15 09:54:24

+1

不用担心我之前做了完全一样的事情! – gcb 2012-08-15 09:58:33