大家来讨论下读WMA文件的问题。我已知其格式,但不会读出来,请帮忙。

qiuyue8110 2007-04-04 03:46:37
BYTE m_Byte[16]={0x33 ,0x26,0xB2 ,0x75, 0x8E ,0x66 ,0xCF, 0x11 ,0xA6 ,0xD9, 0x00, 0xAA ,0x00 ,0x62 ,0xCE, 0x6C};//wma文件头。
char cBuffer[100];
memcpy(cBuffer,m_Byte,sizeof(m_Byte));
CString strWmaTAG= cBuffer

CFile file11;
if(!file11.Open(_name,CFile::modeRead))
{
return ""; //文件无法打开
}
long seekPos11 = 30;

bool x = true;

BYTE pbuf11[16];

while (x)
{
file11.Seek(seekPos11,CFile::begin);



memset(pbuf11,seekPos11,16);

file11.Read(pbuf11,16);

if (pbuf11 == strWmaTAG)
{
x = false;
}

seekPos11 = seekPos11 + 1;
}

BYTE pbuf22[2];
CString strppp ;
seekPos11 = seekPos11 + 8;
file11.Seek(seekPos11,CFile::begin);
memset(pbuf22,seekPos11,2);
file11.Read(pbuf22,2);

...全文
363 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sixthfeel 2008-09-08
  • 打赏
  • 举报
回复
楼主能分享下WMA文件的具体格式嘛,光看你的介绍比较迷糊
kakashi0309 2007-04-06
  • 打赏
  • 举报
回复
gz 接分!
qiuyue8110 2007-04-04
  • 打赏
  • 举报
回复
问题解决

_WMAINFO CPLAYMP3Dlg::GetWmaINFO(CString _strWmaPath)
{
_WMAINFO _str_Wma_info;//定义WMA信息,包括两个变量。

BYTE m_Byte[16]={0x33 ,0x26,0xB2 ,0x75, 0x8E ,0x66 ,0xCF, 0x11 ,0xA6 ,0xD9, 0x00, 0xAA ,0x00 ,0x62 ,0xCE, 0x6C};//wma文件头。
char cBuffer[100];
memcpy(cBuffer,m_Byte,sizeof(m_Byte));
CString strWmaTAG= cBuffer;//得到标准的WMA前字节字符串。

//////////////////////////////////////////////////////////////////
////////////////////以下十行为读WMA文件头。
CFile file11;
if(!file11.Open(_strWmaPath,CFile::modeRead))
{
file11.Close();
_str_Wma_info.Artist = "";
_str_Wma_info.Title = " ";
return _str_Wma_info; //文件无法打开
}
long seekPos11 = 30;

bool x = true;

BYTE pbuf11[16];

while (x)
{
file11.Seek(seekPos11,CFile::begin);



memset(pbuf11,seekPos11,16);

file11.Read(pbuf11,16);

if (pbuf11 == strWmaTAG)
{
x = false;
}

seekPos11 = seekPos11 + 1;
}

TCHAR pbuf22[100];
CString strppp ;
seekPos11 = seekPos11 + 33;
file11.Seek(seekPos11,CFile::begin);
memset(pbuf22,seekPos11,100);
file11.Read(pbuf22,100);

TCHAR name1[50]={0};
TCHAR name2[50]={0};

int l =0;//读唱者
for(int i = 0;i < 100;i++)
{
if (pbuf22[i] == '\0')
{
for(int j = 0;j < i;j++)
{
name1[j] = pbuf22[j];
}
l = i+1;
break;
}



}


//读歌名。
for(int ii = l;ii < 100;ii++)
{
if (pbuf22[ii] == '\0')
{
for(int j = 0;j < ii;j++)
{
name2[j] = pbuf22[l++];
}
break;
}

}


CString na1,na2;
na1 = name1;
na2 = name2;

_str_Wma_info.Artist = name1;
_str_Wma_info.Title = name2;

return _str_Wma_info;
}
qiuyue8110 2007-04-04
  • 打赏
  • 举报
回复
格式的简单说明:


,每一个WMA文件,它的头16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”, 用来标识这个是否为WMA文件。接下来的8个字节为一个整数,表示整个WMA文件头部的大小,这个头部里面包含了Tag信息等所有非音频信息,头部后面的是音频信息,我们在这里就不深入了解了。那个整数接下来的6个字节还没搞清楚是什么用的,不过不影响我们对Tag信息的读写。

也就是说从文件开始偏移量为31开始,里面存放了很多帧,有我们需要的标准Tag信息,扩展Tag信息,WMA文件控制信息等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。这一点和MP3文件的ID3V2信息比较像。

由于我们只需要读写Tag信息,而Tag信息又分别保存在两个帧里,分别为标准Tag帧和扩展Tag帧,所有我们只需要处理这两个帧,其他帧完全可以根据获得的帧长度来跳过。

标准Tag帧只包含歌曲标题,艺术家,版权,备注四个内容。它的帧名是十六进制的“33 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,在24个字节的帧头后紧跟着5个分别为2个字节的整数,前四个分别表示歌曲标题,艺术家,版权,备注的大小,第五个还不清楚是什么用的,大部分情况下是不使用的,即它的大小为0的。

2,586

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧