ffmpegで生成されたwavファイルを読み込もうとしています
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の長さになります。他のサウンドファイルでも試してみましたが、いつも少し遠すぎます。
私も試したのは、wavファイルを16進ダンプすることでした。hexdumpは、for(i <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を取得できますか?
編集
すべての下で指摘されたlilegcbは大丈夫です。解決策は、時間を10進時間で保存し、それを通常の時間に変換する必要があったことでした:-)これは私が思いついたものであり、正常に動作します:
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);
}