mp3文件长度显示不正确

时间:2013-04-07 10:58:37

标签: c++ audio mp3 wav lame

我正在尝试使用LAME(win7,vs2010,c ++)将WAV文件转换为MP3文件。

我找到了这段代码:

convert wav to mp3 using lame

转换工作正常,但是当我尝试使用Windows Media Player打开文件时,文件的长度是错误的。

有没有办法使用lame lib修复此问题?(不使用其他程序或其他lib或命令行,只能使用c ++代码...)

EDITED:经过一些阅读后,我尝试使用lame_get_lametag_frame函数作为sellibitze建议。 这是我的代码:

#include <stdio.h>
#include <lame/lame.h>

int main(void)
{
  int read, write;

  FILE *pcm = fopen("in.pcm", "rb");
  FILE *mp3 = fopen("out.mp3", "wb");

  const int PCM_SIZE = 8192;
  const int MP3_SIZE = 8192;

  short int pcm_buffer[PCM_SIZE*2];
  unsigned char mp3_buffer[MP3_SIZE];

  lame_t lame = lame_init();
  lame_set_in_samplerate(lame, 44100);
  lame_set_VBR(lame, vbr_default);
  lame_set_write_id3tag_automatic(lame, 0);
  lame_init_params(lame);

  char buffer[256];
  int imp3=lame_get_id3v2_tag(gfp, buffer, sizeof(buffer));
  fwrite(buffer, 1, imp3, outf);
  long audio_pos=ftell(outf); // store beginning of audio data

  do {
    read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
    if (read == 0)
        write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
    else
        write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
    fwrite(mp3_buffer, write, 1, mp3);
  } while (read != 0);

  imp3=lame_get_id3v1_tag(gfp, buffer, sizeof(buffer));
  fwrite(buffer, 1, imp3, outf);

  imp3=lame_get_lametag_frame(gfp, buffer, sizeof(buffer));
  fseek(outf,audio_pos,SEEK_SET); // remember beginning of audio data
  fwrite(buffer, 1, imp3, outf);

  lame_close(lame);
  fclose(mp3);
  fclose(pcm);

  return 0;
}

已修复

我应该修复问题,但我真的不明白它是如何修复它的。 我将mp3文件的名称从“out.mp3”更改为任何其他名称,wmp显示正确的长度。我也尝试将已经创建的文件的名称更改为其他内容并且它有效。任何人都可以向我解释它的发生方式吗?是out.mp3的名字保存了吗?

1 个答案:

答案 0 :(得分:0)

您喜欢的示例代码使用VBR模式。在这种情况下,长度信息通常作为元数据放入第一帧。这被称为Xing / VBR标题。它还包括一个低精度搜索表。但是这些信息显然只有在您将所有音频数据传递给LAME后才可用。我建议您在LAME API中查找一个能够更新Xing / VBR标头以反映正确长度和查找表的函数,并在关闭文件之前调用它。

lame_encode_flush不会带你的FILE * thingy因此它无法回到文件的开头并使用Xing / VBR标题更新第一个mp3帧。