我想从mp3文件中读取mp3标签:D并将其保存到txt文件。但我的代码不起作用:(我的意思是我在我的mp3文件中设置正确的位置有一些问题,看看:(为什么它不想工作?)。我必须自己做,没有额外的库。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int getFileSize(const char *filename)
{
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
int main(int argc, char **argv)
{
char *infile = "in.mp3", *outfile = "out.txt";
int infd, bytes_read = 0, buffsize = 255;
char buffer[255];
infd = open(infile, O_RDONLY);
if (infd == -1)
return -1;
int outfd = open(outfile, O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
if (outfd == -1)
return -1;
if(lseek(infd, -128, SEEK_END) < 0)
return -1;
for(;;)
{
bytes_read = read(infd, buffer, buffsize);
if (bytes_read > 0)
{
write(outfd, buffer, bytes_read);
}
else
{
if (bytes_read == 0)
{
if (close(infd) < 0)
return -1;
break;
}
else if (bytes_read == -1)
{
break;
return -1;
}
}
}
return 0;
}
答案 0 :(得分:1)
解决此问题的一种方法:
您需要根据您正在使用的ID3版本扫描文件(问题没有指定Steven所指定的特定版本),找到整个标记或标记标题并从那里解码。
对于 ID3v2 ,标题序列为10字节,如下所示(来自ID3v2规范):
ID3v2/file identifier "ID3"
ID3v2 version $04 00
ID3v2 flags %abcd0000
ID3v2 size 4 * %0xxxxxxx
我的建议是,看看ID3v2 here的规格。检查第3.1章,因为部分工作正在进行背景研究。
对于 ID3v1 ,请检查概览规范here。解码该信息非常简单,完全按照您的问题的评论中的说明进行操作。看看你的代码,这可能就是你想做的事情(在文件末尾跳转到128个字节并开始从那里读取)。
确保您拥有正确标记的文件,并确保在将解码器投入其中之前使用的标记版本。