c - 读取 wav 文件,持续时间/数据大小的计算总是错误的

标签 c linux wav duration wave

我正在尝试读取由 ffmpeg 生成的 wav 文件

ffmpeg -i

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 显示的输出比我做的少 对于 (i < data_size; i += 2) printf("%02x", data[i])

所以我不知何故读得太远了?

我在整个互联网上搜索了有关公式的信息,但我有点卡住了,因为我总是得出相同的结果。

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

您可以阅读以下语句:

“WAVE 文件通常有位于声音数据之前或之后的信息 block (Data chunk)。一些程序(天真地)假设对于 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.54480004。如前所述,这是十进制的。所以你有 3 分钟,然后是 0.54480004 * 60,即 33.28 秒。所以我会说 3.33 分钟长

关于c - 读取 wav 文件,持续时间/数据大小的计算总是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11966844/

相关文章:

node.js - 如何在 Node.Js 中播放 wav 文件?

c - 解析器代码中的奇怪编译器错误

linux - Arduino Micro 使用 AVRDUDE 和 Makefile 但上传卡在循环中

linux - 使用 GRSecurity 补丁编译 Linux 内核 3.10.10

c - Linux 无线网络测试平台

c# - 从 .WAV 文件中读取 24 位样本

python-3.x - 如何使用 pyaudio 播放 wav 二进制数据?

c - 关于 "Advanced Programming in the Unix Environment"这部分

c - 数组指针在线程中如何工作?

c - 为什么这不打印到标准输出 (stdout)?