WinCE系统下M4a音频文件信息解析

/*!
*分析M4a文件标签
*第一个参数为文件指针,第二个参数为存储信息的结构体
*/
// add in 2016.11   lxh
BOOL AudioTagParser:: ParseM4aTag(HANDLE hFile, MP3_INFO *pMp3Info){
    unsigned char headsize[4] = {0};
    unsigned char tagsize[4] = {0};
    unsigned char lensize[4] = {0};
    unsigned char flag[3] = {0}; //flag[0]--album    flag[1]---art     flag[2]----end
    DWORD bytesRead;
    DWORD RealBytes =0;
    BOOL  ret;
    unsigned char cBuf[4] = {0};
    unsigned char* pRealBuf = NULL;
 
 
    ret = ReadFile(hFile, &headsize, sizeof(tagsize), &bytesRead, NULL);//读取头结构的大小
    if(!ret || bytesRead != sizeof(cBuf)){
       return false;
    }
 
 
    ret = ReadFile(hFile, &cBuf, sizeof(cBuf), &bytesRead, NULL);
    if(!ret ||bytesRead != sizeof(cBuf)){
       return false;
    }
 
 
    if (   cBuf[0] != 'f' //固定格式
        || cBuf[1] != 't'
        || cBuf[2] != 'y'
        || cBuf[3] != 'p'
        ){
        return false;
    }
 
 
    SetFilePointer(hFile, count4_metadata_len((unsigned char*)headsize)-8, 0, FILE_CURRENT);
    memset(cBuf, 0, sizeof(cBuf));
 
 
    while(ReadFile(hFile, &tagsize, sizeof(tagsize), &bytesRead, NULL) &&
          ReadFile(hFile, &cBuf, sizeof(cBuf), &bytesRead, NULL)
          ){
 
 
        if(bytesRead != sizeof(tagsize)){
            break;
        }
 
 
        if (   (cBuf[0]=='m' && cBuf[1]=='o' && cBuf[2]=='o' && cBuf[3]=='v') // moov
            || (cBuf[0]=='t' && cBuf[1]=='r' && cBuf[2]=='a' && cBuf[3]=='k') // trak
            || (cBuf[0]=='m' && cBuf[1]=='d' && cBuf[2]=='i' && cBuf[3]=='a') // mdia
            || (cBuf[0]=='m' && cBuf[1]=='i' && cBuf[2]=='n' && cBuf[3]=='f') // minf
            || (cBuf[0]=='s' && cBuf[1]=='t' && cBuf[2]=='b' && cBuf[3]=='l') // stbl
            || (cBuf[0]=='u' && cBuf[1]=='d' && cBuf[2]=='t' && cBuf[3]=='a') // udta
            || (cBuf[0]=='i' && cBuf[1]=='l' && cBuf[2]=='s' && cBuf[3]=='t') // ilst,TAG信息都在这个ATOM之下
            ){
            continue;
        }
        else if ((cBuf[0]=='m' && cBuf[1]=='e' && cBuf[2]=='t' && cBuf[3]=='a')){
            SetFilePointer(hFile, 4, 0, FILE_CURRENT);
            continue;
        }
        else if (cBuf[0] == 0xA9){
 
 
             if (cBuf[1]=='a' && cBuf[2]=='l' && cBuf[3]=='b'){  // 专辑
                 flag[0] = true;
              }
 
 
             else if (cBuf[1]=='A' && cBuf[2]=='R' && cBuf[3]=='T'){// 艺术家
                 flag[1] = true;                 
                 //SetFilePointer(hFile, count4_metadata_len((unsigned char*)tagsize)-8, 0, FILE_CURRENT);
 
 
             }
 
 
             else if (cBuf[1]=='n' && cBuf[2]=='a' && cBuf[3]=='m'){// 名称
               SetFilePointer(hFile, count4_metadata_len((unsigned char*)tagsize)-8, 0, FILE_CURRENT);
               continue;
             }
 
 
             else if (cBuf[1]=='d' && cBuf[2]=='a' && cBuf[3]=='y'){// 日期
                 SetFilePointer(hFile, count4_metadata_len((unsigned char*)tagsize)-8, 0, FILE_CURRENT);
                 continue;
             }
 
 
             if(flag[0] || flag[1]){
                 if ( ReadFile(hFile, &lensize, sizeof(lensize), &bytesRead, NULL)
                      && ReadFile(hFile, &cBuf, sizeof(cBuf), &bytesRead, NULL)
                     ){
                     if(bytesRead != sizeof(cBuf)){
                         break;
                     }
 
 
                     RealBytes = count4_metadata_len((unsigned char*)lensize)- 16;
 
 
                     if( (count4_metadata_len((unsigned char*)lensize)+8) == count4_metadata_len((unsigned char*)tagsize)
                          && cBuf[0] == 'd' && cBuf[1] == 'a' && cBuf[2] == 't' && cBuf[3] == 'a'
                          && RealBytes > 0
                       ){
                         SetFilePointer(hFile, 8, 0, FILE_CURRENT);
                         pRealBuf = new unsigned char[RealBytes+1];
                         if (pRealBuf == NULL){
                             break;
                         }
 
 
                         memset(pRealBuf, 0, RealBytes+1);
                         if(ReadFile(hFile, pRealBuf, RealBytes, &bytesRead, NULL)){
                             if(bytesRead != RealBytes){
                                 break;
                             }
 
 
                             if(flag[0]){//获取到了所需要的信息
                                 MultiByteToWideChar(CP_UTF8, 0, (char *)pRealBuf, min(RealBytes, MAX_ID3_SIZE-1), pMp3Info->szAlbum, min(RealBytes, MAX_ID3_SIZE-1));
                                 pMp3Info->szAlbum[MAX_ID3_SIZE-1]=0;
                                 flag[2]++;
                                 flag[0] = 0;
                             }
 
 
                             if(flag[1]){//获取到了所需要的信息
                                 MultiByteToWideChar(CP_UTF8, 0, (char *)pRealBuf, min(RealBytes, MAX_ID3_SIZE-1), pMp3Info->szArtist, min(RealBytes, MAX_ID3_SIZE-1));
                                 pMp3Info->szArtist[MAX_ID3_SIZE-1]=0;
                                 flag[2]++;
                                 flag[1] = 0;
                             }
 
 
                             delete[] pRealBuf;
                             pRealBuf = NULL;
                             RealBytes = 0;
                         }
                         else{
                            delete[] pRealBuf;
                            pRealBuf = NULL;
                            RealBytes = 0;
                            break;
                        }
                    }
                }
 
 
                 if(flag[2] == 2){ //gain the info of need end
 
 
                     return true ;
                 }
             }
        }
        else{
            SetFilePointer(hFile, count4_metadata_len((unsigned char*)tagsize)-8, 0, FILE_CURRENT);
        }
 
 
    }
 
 
    return false;
}
 

转载于:https://www.cnblogs.com/senli/p/6693264.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值