我試圖讀取的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);
}
關於以分鐘爲單位的長度,請記住您顯示_decimal_數字,以便0.5分鐘爲半分鐘(即30秒)。 – 2012-08-15 09:27:42
文件系統上的wav文件大小是多少? – CyberDem0n 2012-08-15 09:29:59