取出MP3文件的ID3v1信息
想法是先用fseek把文件指针移动到MP3档案最后128字节处,在读出这一段数据存放到一个DAT档中,主要代码如下:
if (OpenDialog1-> Execute())
{
AnsiString FileName1;
FileName1 = OpenDialog1-> FileName;//得到文件名.
AnsiString Ins1 = "\\ ";
int Pos1 = 3;
AnsiString Istr = FileName1.Insert(Ins1, Pos1);
// 打开文件.
pOpen = fopen(FileName1.c_str(), "r ");
// 移动文件指针到.
fseek(pOpen, 128L, SEEK_END);
// 存放读出的数据.
BYTE *pSeek = NULL;
pSeek = new BYTE[128];
memset(pSeek, 0, 128);
// 打开一个DAT用来存放.
FILE *pOpen1 = NULL;
pOpen1 = fopen( "G:\\1234.dat ", "wb ");
fwrite(pSeek, 128, 1, pOpen1);
fclose(pOpen1);
}
这样做得到的数据跟原MP3数据不一样了(我用UtraEdit打开看的)...请问问题出在哪里?或者有没有别的方法能从某一特定位置读出MP3等文件的一段连续数据?
然后我写了一段代码实验,直接读一个MP3档,然后再把它写入到DAT文件,用跟上面相同的方法,发现数据也有些不一样了,尤其在末尾!但是大多数MP3还是能正常播放,由于丢掉的是ID3信息所以在播放器里看不到歌手啊,专辑名等信息了....
无比郁闷...
[解决办法]
我编写过这样的小程序,获取和修改mp3的ID3v1和ID3v2
http://blog.csdn.net/Y___Y/archive/2007/02/02/1501350.aspx
[解决办法]
#include <fstream.h>
if (OpenDialog1-> Execute())
{
AnsiString FileName1;
FileName1 = OpenDialog1-> FileName;//得到文件名.
ifstream input;
input.open(FileName1.c_str(), ios::binary);
if(!input)
{
return;
}
input.seekg(0,ios::end);
int length = input.tellg();
input.seekg(length - 128);
BYTE *pSeek = NULL;
pSeek = new BYTE[128];
input.read(pSeek,128);
input.close();
ofstream output;
output.open( "c:\\1234.dat ",ios::binary);
if(!output)
{
return;
}
output.write(pSeek,128);
output.close();
}