2012-08-15 43 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