我正在尝试使用 LAME (win7,vs2010,c++) 将 WAV 文件转换为 MP3 文件。
我找到了这段代码:
转换工作正常,但是当我尝试使用 windows 媒体播放器打开文件时,文件的长度是错误的。
有没有办法使用蹩脚的lib来解决这个问题?(不是用另一个程序或另一个lib或命令行,只能用c++代码......)
已编辑:经过一番阅读后,我尝试按照 sellibitze 的建议使用 lame_get_lametag_frame 函数。这是我的代码:
#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 更改为其他名称,并且它起作用了。任何人都可以向我解释它的发生方式吗?名称 out.mp3 是否保存?