3

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);
}
4

1 に答える 1

3

それは私には大丈夫に聞こえます。つまり、あなたの曲は3.54480004です。すでに述べたように、これは10進数です。つまり、3分、次に0.54480004 * 60、つまり33.28秒になります。だから私は3.33分の長さだと思います

于 2012-08-15T09:34:37.123 に答える