如何在C(unix)中读取mp3文件标签?

如何在C(unix)中读取mp3文件标签?,c,unix,mp3,C,Unix,Mp3,我想从mp3文件中读取mp3标签:D并将其保存到txt文件。但是我的代码不起作用:(我的意思是我在设置mp3文件的正确位置时遇到了一些问题,看一看:(为什么它不起作用?)。我必须自己做,没有多余的libs #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/

我想从mp3文件中读取mp3标签:D并将其保存到txt文件。但是我的代码不起作用:(我的意思是我在设置mp3文件的正确位置时遇到了一些问题,看一看:(为什么它不起作用?)。我必须自己做,没有多余的libs

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
int getFileSize(常量字符*文件名)
{
结构统计;
if(stat(filename,&st)==0)
返回st.st_大小;
返回-1;
}
int main(int argc,字符**argv)
{
char*infile=“in.mp3”、*outfile=“out.txt”;
int infd,字节数为0,buffsize=255;
字符缓冲区[255];
infd=打开(仅限填充);
如果(infd==-1)
返回-1;
int OUFD=打开(输出文件,O|U WRONLY | O|U TRUNC,S|U IRUSR | S|U IWUSR);
如果(输出==-1)
返回-1;
if(lseek(infd,-128,SEEK_END)<0)
返回-1;
对于(;;)
{
字节\读取=读取(infd、缓冲区、buffsize);
如果(字节读取>0)
{
写入(输出、缓冲、字节\读取);
}
其他的
{
如果(字节数_读取==0)
{
如果(关闭(infd)<0)
返回-1;
打破
}
else if(字节\u读取==-1)
{
打破
返回-1;
}
}
}
返回0;
}

解决此问题的一种方法:

您需要根据使用的ID3版本扫描文件(问题没有Steven指定的特定版本),找到整个标记或标记头并从那里解码

对于ID3v2,标头序列为10字节,如下所示(来自ID3v2规范):

我的建议是,看看ID3v2的规范。检查第3.1章,因为部分工作是做背景研究

对于ID3v1请检查该概述规范。解码该信息非常简单,并且工作方式与问题注释中所述完全相同。查看您的代码,这可能是您想要做的(在文件末尾跳到128字节,然后从那里开始读取)


在将解码器扔向文件之前,请确保您有一个正确标记的文件,并确定您使用的标记版本。

解决此问题的一种方法:

您需要根据使用的ID3版本扫描文件(问题没有Steven指定的特定版本),找到整个标记或标记头并从那里解码

对于ID3v2,标头序列为10字节,如下所示(来自ID3v2规范):

我的建议是,看看ID3v2的规范。检查第3.1章,因为部分工作是做背景研究

对于ID3v1请检查该概述规范。解码该信息非常简单,并且工作方式与问题注释中所述完全相同。查看您的代码,这可能是您想要做的(在文件末尾跳到128字节,然后从那里开始读取)


在使用解码器之前,请确保您有一个正确标记的文件,并且确定您正在使用的标记版本。

我猜您只需要读取ID3v1信息?ID3v2标记可以位于文件中的任何位置,而不仅仅位于文件的末尾。您可能希望以字节序列的形式搜索Id3标头信息,然后就可以开始了解码格式。您是否查看了Id3参考以了解标准的详细规范?@count0:是的,这正是我想要做的-获取标题、艺术家等信息。但是我的代码只写入
out.txt
文件中那些奇怪的字母:@StevenBurnap:是的,我只想阅读标题、艺术家等信息在mp3文件的末尾(最后128字节)@maxtaldykin请注意。我认为您只需要读取ID3v1信息?ID3v2标记可以位于文件中的任何位置,而不只是在末尾。您可能希望以字节序列的形式搜索Id3标头信息,然后就可以开始解码格式。您是否查看了Id3参考以了解标准的详细规范?@cUNT0:是的,这正是我想要做的-获取诸如标题、艺术家等信息。但是我的代码只在
out.txt
文件中写入了那些奇怪的字母:@StevenBurnap:是的,我只想读取mp3文件末尾(最后128字节)的标题、艺术家等信息@maxtaldykin请注意。
 ID3v2/file identifier      "ID3"
 ID3v2 version              $04 00
 ID3v2 flags                %abcd0000
 ID3v2 size             4 * %0xxxxxxx