ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

读取WAV文件,计算持续时间/ data_size总是错误

2019-11-27 20:50:57  阅读:435  来源: 互联网

标签:duration wav wave c-3 linux


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

ffmpeg -i av

FFmpeg生成的wav文件的标头大小为18,但没有任何扩展名数据.

这是我的数据结构:

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文件十六进制转储.十六进制转储显示的输出少于我执行的输出
对于(i< data_size; i = 2)printf(“?x”,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.54480004.如前所述,以十进制表示.因此,您有3分钟,然后是0.54480004 * 60,即33.28秒.所以我说3.33分钟长

标签:duration,wav,wave,c-3,linux
来源: https://codeday.me/bug/20191127/2076877.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有