id3lib无法读取相关信息,其实MP3中有ID3V1/ID3V2信息

发布于 2022-10-15 07:58:06 字数 13918 浏览 21 评论 0

在sourceforget中下载了id3lib源码,./configure时出错,根据网上人家说的改了一些东东,可以编绎安装成功,但是现在我用这个库来读取.mp3文件信息tag时,任何标记都读取不到?
但是有的.mp3文件可以读取,下面是代码,请指点!
<code>
#include "helun.h"

char * convert(char *p,int len,char *srccode,char *descode,int * returnlen)
{
char * pd;
size_t res;
char *t;//必需定义此字符指针,不能使用&pd
size_t lenin=len;
size_t lenout;

iconv_t ic=iconv_open(descode ,srccode);
        *returnlen=0;

        if(ic==(iconv_t)-1)
                        {
                        printf("Iconv_t Create Error\n");
                        return NULL;
                }       
       
        lenout=len*6;
        pd=(char *)malloc(lenout);
        if(!pd)
                {
                printf("Malloc Fail\n");
                return NULL;
               
                }
        t=pd;
        memset(pd,0,lenout);
       

        res=iconv(ic,&p,&lenin,&t,&lenout);
        if(res==-1)
                {
                printf("Convert Fail\n");
                free(pd);
                return NULL;
                }
        *returnlen=len*6-lenout;
       
       
       
        return pd;

}

void deal(info *res)
{
char gbk[4]="GBK";
char unicode[10]="UNICODE";
char *tmp;
char *t=NULL;
int len;
switch(res->encoding)
{
        case 0://gbk
                tmp=gbk;
                if(*(res->title)!=0)        {
                t=convert(res->title,strlen(res->title),tmp,"UTF-8",&len);
                memset(res->title,0,sizeof(res->title));
                strcpy(res->title,t);
                free(t);
                }
                if(*(res->album)!=0)
                        {
                t=convert(res->album,strlen(res->album),tmp,"UTF-8",&len);
                memset(res->album,0,sizeof(res->album));
                strcpy(res->album,t);
                free(t);
                }
       
                if(*(res->author)!=0)
                        {
                t=convert(res->author,strlen(res->author),tmp,"UTF-8",&len);
                memset(res->author,0,sizeof(res->author));
                strcpy(res->author,t);
                free(t);
        }
                if(*(res->comment)!=0)
                        {
                t=convert(res->comment,strlen(res->comment),tmp,"UTF-8",&len);
                memset(res->comment,0,sizeof(res->comment));
                strcpy(res->comment,t);
                free(t);

        }
       
                break;
        case 6://unicode
                tmp=unicode;
                if(res->title)        {
                t=convert(res->title,strlen(res->title),tmp,"UTF-8",&len);
                memset(res->title,0,sizeof(res->title));
                strcpy(res->title,t);
                free(t);
                }
                if(res->album)
                        {
                t=convert(res->album,strlen(res->album),tmp,"UTF-8",&len);
                memset(res->album,0,sizeof(res->album));
                strcpy(res->album,t);
                free(t);
                }
                if(res->author)
                        {
                t=convert(res->author,strlen(res->author),tmp,"UTF-8",&len);
                memset(res->author,0,sizeof(res->author));
                strcpy(res->author,t);
                free(t);
        }
                if(res->comment)
                        {
                t=convert(res->comment,strlen(res->comment),tmp,"UTF-8",&len);
                memset(res->comment,0,sizeof(res->comment));
                strcpy(res->comment,t);
                free(t);

        }
                break;
}

}
info * getinfo(char *path)
{
int i=0;
char str[1024];
int len;
int type=-10;
info *pres;
int frameid;
int fieldid;
char tmp[50]="not known";
ID3_Tag myTag;
ID3_Tag::Iterator* iter;
ID3_Frame::Iterator* iter1;
ID3_Field* myField;
   ID3_Frame* myFrame;

myTag.Link(path,ID3TT_ALL);
       
pres=(info *)calloc(1,sizeof(info));
if(!pres)
        {
        printf("no mem \n");
        return NULL;
                }
       
        iter = myTag.CreateIterator();

           myFrame = NULL;

   while (NULL != (myFrame = iter->GetNext()))
   {
        //printf("i=%d\n",i++);
         iter1 = myFrame->CreateIterator();
        if(!iter1)
                continue;
          myField = NULL;
        frameid=myFrame->GetID();
   while (NULL != (myField = iter1->GetNext()))
   {

        type=myField->GetEncoding();
        if(type==-1)continue;
        memset(str,0,1024);
        myField->Get(str,1024);
        fieldid=myField->GetID();
        //printf("frameid=%d,field=%d,str=%s\n",myFrame->GetID(),myField->GetID(),str);
        pres->encoding=type;
        if(frameid==29&&fieldid==2)
                {
                       
                        strcpy(pres->album,str);               
               
                        continue ;
                }
        if(frameid==61&&fieldid==2)
                {
                        strcpy(pres->author,str);
                continue;
                }
        if(frameid==47&&fieldid==2)
        {
                        strcpy(pres->title,str);
       
                continue ;
        }
        if(frameid==68&&fieldid==2)
        {
                        strcpy(pres->track,str);

                        continue ;
        }
        if(frameid==32&&fieldid==2)
        {
                strcpy(pres->gener,str);
               
                continue;
                }
        if(frameid==80&&fieldid==2)
        {
                        strcpy(pres->year,str);
        continue ;
        }
        if(frameid==4&&fieldid==2)
        {
                strcpy(pres->comment,str);
        continue ;
        }

   }
   delete iter1;

       

   }

   delete iter;

        return pres;

}
void showinfo(info * res)
{
if(!res)
        return ;
printf("encoding============%d\n",res->encoding);
printf("title===============%s\n",res->title);
printf("author==============%s\n",res->author);
printf("album===============%s\n",res->album);
printf("year================%s\n",res->year);
printf("track===============%s\n",res->track);
printf("comment=============%s\n",res->comment);
printf("gener===============%s\n",res->gener);

}
int main()
{
info * res;
res=getinfo("/root/c++/test/梦醒了.mp3");
deal(res);
if(res)
{
showinfo(res);

}

return 0;

}
</code>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文