- 浏览: 235828 次
- 性别:
- 来自: 南京
最新评论
-
baby8117628:
vc下mp3 IDv1和IDV2的读取 -
gezexu:
你好,我按照你的步骤一步步进行但是安装libvorbis的时候 ...
linux如何搭建强大的FFMPEG环境 -
ini_always:
帅哥,转载也把格式做好点,另外出处也要注明一下吧。。。
MP3文件格式解析
/*这是修改后的代码,VC下读ID3v2 & ID3v1 , 读mp3_tagHeader都没问题.*/
/******************************************************************
File : mp3info.c
*******************************************************************************/
#include<stdio.h>
#include<io.h>
#include<string.h>
#include<stdlib.h>
/*******************************************************************************/
void main()
{
FILE *fp;
int bHasID3V2;
char cVer;
char cRevision;
int bHasExtHeader=0;
int ID3V2_size;
#define ID3V1_size 128
char cID3V2_head[10];
char cID3v2Frame_head[10];
char *cID3v2Frame;
long iID3v2Frame_length;
/*##########################Symbol In Frame###################################*/
long iFrameStart,iFrameMove=0, iFrameCount=0;
unsigned long iFrameSize=0;
char cFrameHead_bin[33];
char cFrameHead_bin_temp[9];
/*##########################Symbol In ID3V1###################################*/
char cID3V1[128];
/*##########################Symbol Above######################################*/
unsigned char* cBuffer;
int SamplingrateTable [3][3]={{44100,22050,11025},{48000,24000,120000},{32000,16000,8000}};
char* ChannelDescrip[4]={"立体声","混合立体声","双声","单声"};
int cBuffer_size=1024,Bitrate,FrameSize,FrameCount,mp3Duration;
char LayerDescript ,bRateIndex ,bSampleRate,Version,bPadding,bChannelMode;
long int flength;
int i=0,j=0;
char argv[]={"yzhforce.mp3"};
/*##########################Symbol Above######################################*/
void getBin( int ,char* );
int GetBitRate(int ,int , int );//函数宣告
if((fp=fopen(argv,"rb"))==NULL)
{
printf("ERROR:can't open the file!");
getchar();
exit(1);
}
/*##########################ID3V2 Reading#####################################*/
fread(cID3V2_head,10,1,fp);
if( (cID3V2_head[0]=='I'||cID3V2_head[1]=='i')
&&(cID3V2_head[1]=='D'||cID3V2_head[2]=='d')
&&cID3V2_head[2]=='3')
{
bHasID3V2=1;
cVer=cID3V2_head[3];
cRevision=cID3V2_head[4];
if(cID3V2_head[5]&0x64==0x64) bHasExtHeader = 1;
if(cID3V2_head[5]&0x10==0x10) bHasExtHeader = 1;
ID3V2_size = (cID3V2_head[6]&0x7F)*0x200000
+ (cID3V2_head[7]&0x7F)*0x400
+ (cID3V2_head[8]&0x7F)*0x80
+ (cID3V2_head[9]&0x7F);
printf("ID3V2_size:%d bytes\n",ID3V2_size);
iFrameStart=--ID3V2_size;
}
else
{
bHasID3V2=0;
printf("\nThere is no ID3V2*");
}
rewind(fp);/*改文件指针指向文件头*/
fseek(fp,10L,1);
while((ftell(fp)+10)<=ID3V2_size)
{
memset(cID3v2Frame_head,0,10);/*内存清空*/
fread(cID3v2Frame_head,10,1,fp);/*ID3V2帧信息头读取*/
iID3v2Frame_length =(long)(cID3v2Frame_head[4]*0x100000000
+cID3v2Frame_head[5]*0x10000
+cID3v2Frame_head[6]*0x100
+cID3v2Frame_head[7]);/*计算帧的大小.*/
if (cID3v2Frame_head[0]=='\0'
&& cID3v2Frame_head[1]=='\0'
&& cID3v2Frame_head[2]=='\0'
&& cID3v2Frame_head[3]=='\0')
break;
for (i=0;i<4;i++) putchar(cID3v2Frame_head[i]); /*FrameSign(4)*/
putchar('-');putchar('>'); /* Print "->"*/
cID3v2Frame=malloc(iID3v2Frame_length);/* 为 cID3v2Frame 指针分配内存, 功能类似于VB中的动
态数组*/
if (cID3v2Frame!=NULL)// 检测动态内存分配是否已经成功
{
fread(cID3v2Frame,iID3v2Frame_length,1,fp);
i=0;
while(i<iID3v2Frame_length)
{
putchar(cID3v2Frame[i]);
i++;
}
putchar('\n');
free(cID3v2Frame);
}
else
{
if (fp!=NULL) fclose(fp);
printf("ERROR:Memory Exhausted!");
exit(1);
}
}
putchar('*');
putchar('\n');
/*########################## (mp3_FrameHeader) Reading #####################################*/
fseek(fp, 0L, SEEK_END); //移文件指针到文件尾
flength = ftell(fp); //文件长
rewind(fp);
fseek(fp,10+ID3V2_size,1);
while((ftell(fp)+4)<flength)
{
if (ftell(fp)+1024<=flength)
cBuffer_size=1024;
else
cBuffer_size=flength-ftell(fp);
cBuffer=malloc(cBuffer_size);
if (cBuffer==NULL)// 检测动态内存分配是否已经成功
{
if (fp!=NULL) fclose(fp);
printf("ERROR:Memory Exhausted!");
exit(1);
}
memset(cBuffer,0,cBuffer_size);
fread(cBuffer,cBuffer_size,1,fp);
for(i=0;i<(cBuffer_size-4); i++)
{
//Mp3帧头(FRAMEHEADER)格式如下:AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
LayerDescript = (cBuffer[i+1] & 0x6)>>1;//Part CC IN 'AAABBCCD' ,Layer description '00' -
reserved
//Part EEEE in 'EEEEFFGH', But '1111' is Bad Bitrate index, "bad" means that this is not an allowed value
bRateIndex = cBuffer[i+2] /0x10 ;// EEEEXXXX!='1111'
bSampleRate = (cBuffer[i+2] & 0xA) >>2 ;//Part FF IN 'EEEEFFGH' ,'11' reserved
if (cBuffer[i] ==0xFF
&& cBuffer[i+1] > 0xE0
&& bRateIndex != 0xF
&& LayerDescript != 0x0
&& bSampleRate < 0x3 )
{
printf("Mp3_FrameHeader->");
memset(cFrameHead_bin,0,32);
j=cBuffer[i];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp);
putchar('-');
j=cBuffer[i+1];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp); //strcat 的两个传入参数都必需以 '\0' 代表结
尾
putchar('-');
j=cBuffer[i+2];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp);
putchar('-');
j=cBuffer[i+3];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp);
Version = (cBuffer[i+1] & 0x18)>>3;
bPadding=(cBuffer[i+1] & 0x2)>>1;
Bitrate = GetBitRate(bRateIndex, LayerDescript, Version);
bChannelMode=(cBuffer[i+3] & 0xC0)>>6;
putchar ('\n');
if (bRateIndex != 0)
{
switch (Version)
{
case 0:
printf("MPEG 2.5 层 %d, %dHz %s\n",4-LayerDescript,
SamplingrateTable[bSampleRate][2],ChannelDescrip[bChannelMode]);
FrameSize = ((72 * Bitrate*1000) / SamplingrateTable[bSampleRate][2]) +
bPadding;
FrameCount=(int)((flength-(ftell(fp)-cBuffer_size+i)) /FrameSize);
mp3Duration=(int)(FrameCount*0.026);//每帧的播放时间:无论帧长
是多少,每帧的播放时间都是26ms;
printf("CBR:-> %dKbit %d帧\n",Bitrate,FrameCount);
printf("长度:%d 秒",mp3Duration);
break;
case 2:
printf("MPEG 2.0 层 %d, %dHz %s\n",4-LayerDescript,
SamplingrateTable[bSampleRate][1],ChannelDescrip[bChannelMode]);
FrameSize = ((72 * Bitrate*1000) / SamplingrateTable[bSampleRate][1]) +
bPadding;
FrameCount=(int)((flength-(ftell(fp)-cBuffer_size+i)) /FrameSize);
mp3Duration=(int)(FrameCount*0.026);//每帧的播放时间:无论帧长
是多少,每帧的播放时间都是26ms;
printf("CBR:-> %dKbit %d帧\n",Bitrate,FrameCount);
printf("长度:%d 秒",mp3Duration);
break;
case 3:
printf("MPEG 1.0 层 %d, %dHz %s\n",4-LayerDescript,
SamplingrateTable[bSampleRate][0],ChannelDescrip[bChannelMode]);
FrameSize = ((144 * Bitrate*1000) / SamplingrateTable[bSampleRate][0]) +
bPadding;
FrameCount=(int)((flength-(ftell(fp)-cBuffer_size+i)) /FrameSize);
mp3Duration=(int)(FrameCount*0.026);//每帧的播放时间:无论帧长
是多少,每帧的播放时间都是26ms;
printf("CBR:-> %dKbit %d帧\n",Bitrate,FrameCount);
printf("长度:%d 秒",mp3Duration);
break;
}
}
else
printf("\nThis a Free Rate MP3 File!\n");
cBuffer_size=-1;
break;
}
}
free(cBuffer);
if (cBuffer_size ==(-1) ) break;
}
/*##########################ID3V1 Reading#####################################*/
fseek(fp,-128L,SEEK_END);
fread(cID3V1,ID3V1_size ,1,fp);
if( (cID3V1[0]=='T'||cID3V1[0]=='t')
&&(cID3V1[1]=='A'||cID3V1[1]=='a')
&&(cID3V1[2]=='G'||cID3V1[2]=='g'))
{
printf("\n*\nID3V1_size:%d bytes\n",ID3V1_size );
for(i=0;i<128;i++) putchar(cID3V1[i]);
putchar('|');
putchar('\n');
}
else
{
printf("\nThere is no ID3V1*");
}
fclose(fp);
getchar();
}
void getBin( int dec,char* bin)
{
int i,j,len;
char temp[8];
memset(temp,0,8);
itoa(dec,temp,2);///把整数i转换成字符串将i转换为字符串放入temp中,最后一个数字表示2进制
len=strlen(temp);
memset(bin,0,strlen(bin));
for(i=0,j=0;i<8;i++,j++)
{
if (temp[j]!='\0')
bin[i]=temp[j];
else
bin[i]='0';
}
bin[i]='\0';
for(i=0,j=0;i<8;i++,j++) putchar(bin[i]);
}
int GetBitRate(int bRateIndex,int LayerDescript, int Version)
{
int BitrateTable[6][15]=
{
{-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
{-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
{-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320},
{-1,32,64,96,128,160,192,2324,256,288,320,352,384,416,448},
{-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
{-1,8,16,24,32,64,80,56,64,128,160,112,128,256,320}
}; //kbps (-1) means :free
int i,j;
if (Version==3 && LayerDescript==3 )j=0;
else if (Version==3 && LayerDescript==2 )j=1;
else if (Version==3 && LayerDescript==1 )j=2;
else if (Version==2 && LayerDescript==1 )j=3;
else if (Version==2 && LayerDescript==2 )j=4;
else if (Version==2 && LayerDescript==3 )j=5;
i=BitrateTable[j][bRateIndex];
return i;
}
/******************************************************************
File : mp3info.c
*******************************************************************************/
#include<stdio.h>
#include<io.h>
#include<string.h>
#include<stdlib.h>
/*******************************************************************************/
void main()
{
FILE *fp;
int bHasID3V2;
char cVer;
char cRevision;
int bHasExtHeader=0;
int ID3V2_size;
#define ID3V1_size 128
char cID3V2_head[10];
char cID3v2Frame_head[10];
char *cID3v2Frame;
long iID3v2Frame_length;
/*##########################Symbol In Frame###################################*/
long iFrameStart,iFrameMove=0, iFrameCount=0;
unsigned long iFrameSize=0;
char cFrameHead_bin[33];
char cFrameHead_bin_temp[9];
/*##########################Symbol In ID3V1###################################*/
char cID3V1[128];
/*##########################Symbol Above######################################*/
unsigned char* cBuffer;
int SamplingrateTable [3][3]={{44100,22050,11025},{48000,24000,120000},{32000,16000,8000}};
char* ChannelDescrip[4]={"立体声","混合立体声","双声","单声"};
int cBuffer_size=1024,Bitrate,FrameSize,FrameCount,mp3Duration;
char LayerDescript ,bRateIndex ,bSampleRate,Version,bPadding,bChannelMode;
long int flength;
int i=0,j=0;
char argv[]={"yzhforce.mp3"};
/*##########################Symbol Above######################################*/
void getBin( int ,char* );
int GetBitRate(int ,int , int );//函数宣告
if((fp=fopen(argv,"rb"))==NULL)
{
printf("ERROR:can't open the file!");
getchar();
exit(1);
}
/*##########################ID3V2 Reading#####################################*/
fread(cID3V2_head,10,1,fp);
if( (cID3V2_head[0]=='I'||cID3V2_head[1]=='i')
&&(cID3V2_head[1]=='D'||cID3V2_head[2]=='d')
&&cID3V2_head[2]=='3')
{
bHasID3V2=1;
cVer=cID3V2_head[3];
cRevision=cID3V2_head[4];
if(cID3V2_head[5]&0x64==0x64) bHasExtHeader = 1;
if(cID3V2_head[5]&0x10==0x10) bHasExtHeader = 1;
ID3V2_size = (cID3V2_head[6]&0x7F)*0x200000
+ (cID3V2_head[7]&0x7F)*0x400
+ (cID3V2_head[8]&0x7F)*0x80
+ (cID3V2_head[9]&0x7F);
printf("ID3V2_size:%d bytes\n",ID3V2_size);
iFrameStart=--ID3V2_size;
}
else
{
bHasID3V2=0;
printf("\nThere is no ID3V2*");
}
rewind(fp);/*改文件指针指向文件头*/
fseek(fp,10L,1);
while((ftell(fp)+10)<=ID3V2_size)
{
memset(cID3v2Frame_head,0,10);/*内存清空*/
fread(cID3v2Frame_head,10,1,fp);/*ID3V2帧信息头读取*/
iID3v2Frame_length =(long)(cID3v2Frame_head[4]*0x100000000
+cID3v2Frame_head[5]*0x10000
+cID3v2Frame_head[6]*0x100
+cID3v2Frame_head[7]);/*计算帧的大小.*/
if (cID3v2Frame_head[0]=='\0'
&& cID3v2Frame_head[1]=='\0'
&& cID3v2Frame_head[2]=='\0'
&& cID3v2Frame_head[3]=='\0')
break;
for (i=0;i<4;i++) putchar(cID3v2Frame_head[i]); /*FrameSign(4)*/
putchar('-');putchar('>'); /* Print "->"*/
cID3v2Frame=malloc(iID3v2Frame_length);/* 为 cID3v2Frame 指针分配内存, 功能类似于VB中的动
态数组*/
if (cID3v2Frame!=NULL)// 检测动态内存分配是否已经成功
{
fread(cID3v2Frame,iID3v2Frame_length,1,fp);
i=0;
while(i<iID3v2Frame_length)
{
putchar(cID3v2Frame[i]);
i++;
}
putchar('\n');
free(cID3v2Frame);
}
else
{
if (fp!=NULL) fclose(fp);
printf("ERROR:Memory Exhausted!");
exit(1);
}
}
putchar('*');
putchar('\n');
/*########################## (mp3_FrameHeader) Reading #####################################*/
fseek(fp, 0L, SEEK_END); //移文件指针到文件尾
flength = ftell(fp); //文件长
rewind(fp);
fseek(fp,10+ID3V2_size,1);
while((ftell(fp)+4)<flength)
{
if (ftell(fp)+1024<=flength)
cBuffer_size=1024;
else
cBuffer_size=flength-ftell(fp);
cBuffer=malloc(cBuffer_size);
if (cBuffer==NULL)// 检测动态内存分配是否已经成功
{
if (fp!=NULL) fclose(fp);
printf("ERROR:Memory Exhausted!");
exit(1);
}
memset(cBuffer,0,cBuffer_size);
fread(cBuffer,cBuffer_size,1,fp);
for(i=0;i<(cBuffer_size-4); i++)
{
//Mp3帧头(FRAMEHEADER)格式如下:AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
LayerDescript = (cBuffer[i+1] & 0x6)>>1;//Part CC IN 'AAABBCCD' ,Layer description '00' -
reserved
//Part EEEE in 'EEEEFFGH', But '1111' is Bad Bitrate index, "bad" means that this is not an allowed value
bRateIndex = cBuffer[i+2] /0x10 ;// EEEEXXXX!='1111'
bSampleRate = (cBuffer[i+2] & 0xA) >>2 ;//Part FF IN 'EEEEFFGH' ,'11' reserved
if (cBuffer[i] ==0xFF
&& cBuffer[i+1] > 0xE0
&& bRateIndex != 0xF
&& LayerDescript != 0x0
&& bSampleRate < 0x3 )
{
printf("Mp3_FrameHeader->");
memset(cFrameHead_bin,0,32);
j=cBuffer[i];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp);
putchar('-');
j=cBuffer[i+1];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp); //strcat 的两个传入参数都必需以 '\0' 代表结
尾
putchar('-');
j=cBuffer[i+2];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp);
putchar('-');
j=cBuffer[i+3];
getBin(j,cFrameHead_bin_temp);
strcat(cFrameHead_bin,cFrameHead_bin_temp);
Version = (cBuffer[i+1] & 0x18)>>3;
bPadding=(cBuffer[i+1] & 0x2)>>1;
Bitrate = GetBitRate(bRateIndex, LayerDescript, Version);
bChannelMode=(cBuffer[i+3] & 0xC0)>>6;
putchar ('\n');
if (bRateIndex != 0)
{
switch (Version)
{
case 0:
printf("MPEG 2.5 层 %d, %dHz %s\n",4-LayerDescript,
SamplingrateTable[bSampleRate][2],ChannelDescrip[bChannelMode]);
FrameSize = ((72 * Bitrate*1000) / SamplingrateTable[bSampleRate][2]) +
bPadding;
FrameCount=(int)((flength-(ftell(fp)-cBuffer_size+i)) /FrameSize);
mp3Duration=(int)(FrameCount*0.026);//每帧的播放时间:无论帧长
是多少,每帧的播放时间都是26ms;
printf("CBR:-> %dKbit %d帧\n",Bitrate,FrameCount);
printf("长度:%d 秒",mp3Duration);
break;
case 2:
printf("MPEG 2.0 层 %d, %dHz %s\n",4-LayerDescript,
SamplingrateTable[bSampleRate][1],ChannelDescrip[bChannelMode]);
FrameSize = ((72 * Bitrate*1000) / SamplingrateTable[bSampleRate][1]) +
bPadding;
FrameCount=(int)((flength-(ftell(fp)-cBuffer_size+i)) /FrameSize);
mp3Duration=(int)(FrameCount*0.026);//每帧的播放时间:无论帧长
是多少,每帧的播放时间都是26ms;
printf("CBR:-> %dKbit %d帧\n",Bitrate,FrameCount);
printf("长度:%d 秒",mp3Duration);
break;
case 3:
printf("MPEG 1.0 层 %d, %dHz %s\n",4-LayerDescript,
SamplingrateTable[bSampleRate][0],ChannelDescrip[bChannelMode]);
FrameSize = ((144 * Bitrate*1000) / SamplingrateTable[bSampleRate][0]) +
bPadding;
FrameCount=(int)((flength-(ftell(fp)-cBuffer_size+i)) /FrameSize);
mp3Duration=(int)(FrameCount*0.026);//每帧的播放时间:无论帧长
是多少,每帧的播放时间都是26ms;
printf("CBR:-> %dKbit %d帧\n",Bitrate,FrameCount);
printf("长度:%d 秒",mp3Duration);
break;
}
}
else
printf("\nThis a Free Rate MP3 File!\n");
cBuffer_size=-1;
break;
}
}
free(cBuffer);
if (cBuffer_size ==(-1) ) break;
}
/*##########################ID3V1 Reading#####################################*/
fseek(fp,-128L,SEEK_END);
fread(cID3V1,ID3V1_size ,1,fp);
if( (cID3V1[0]=='T'||cID3V1[0]=='t')
&&(cID3V1[1]=='A'||cID3V1[1]=='a')
&&(cID3V1[2]=='G'||cID3V1[2]=='g'))
{
printf("\n*\nID3V1_size:%d bytes\n",ID3V1_size );
for(i=0;i<128;i++) putchar(cID3V1[i]);
putchar('|');
putchar('\n');
}
else
{
printf("\nThere is no ID3V1*");
}
fclose(fp);
getchar();
}
void getBin( int dec,char* bin)
{
int i,j,len;
char temp[8];
memset(temp,0,8);
itoa(dec,temp,2);///把整数i转换成字符串将i转换为字符串放入temp中,最后一个数字表示2进制
len=strlen(temp);
memset(bin,0,strlen(bin));
for(i=0,j=0;i<8;i++,j++)
{
if (temp[j]!='\0')
bin[i]=temp[j];
else
bin[i]='0';
}
bin[i]='\0';
for(i=0,j=0;i<8;i++,j++) putchar(bin[i]);
}
int GetBitRate(int bRateIndex,int LayerDescript, int Version)
{
int BitrateTable[6][15]=
{
{-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
{-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
{-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320},
{-1,32,64,96,128,160,192,2324,256,288,320,352,384,416,448},
{-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
{-1,8,16,24,32,64,80,56,64,128,160,112,128,256,320}
}; //kbps (-1) means :free
int i,j;
if (Version==3 && LayerDescript==3 )j=0;
else if (Version==3 && LayerDescript==2 )j=1;
else if (Version==3 && LayerDescript==1 )j=2;
else if (Version==2 && LayerDescript==1 )j=3;
else if (Version==2 && LayerDescript==2 )j=4;
else if (Version==2 && LayerDescript==3 )j=5;
i=BitrateTable[j][bRateIndex];
return i;
}
发表评论
-
使用ffmpeg为库编写的小型多媒体播放器源代码
2010-01-21 16:52 4373今天突发奇想,就在以前音频播放器(详细情况请看这里——http ... -
ffmpeg提取音频播放器总结
2010-01-21 16:31 6037ffmpeg提取音频播放器总 ... -
ffmpeg开发指南
2010-01-20 17:26 3397ffmpeg 中的Libavformat 和 li ... -
linux下安装ffmpeg过程
2010-01-18 15:48 1905最近互联网视频共享的 ... -
【PNG overview】PNG专题!
2010-01-18 13:39 3398【PNG overview】PNG专题! 作者 鼯鼠 ... -
Big Endian 和 Little Endian
2010-01-18 13:29 1566Peter Lee 2008-04-20 一、字节序 ... -
MediaInfo开源工程
2010-01-18 13:22 2397一、简介 MediaInfo 用来 ... -
MP3文件格式解析
2010-01-18 10:58 3574MP3文件格式解析 Peter Lee 2008-06-0 ... -
LAME-mp3
2010-01-18 10:40 2051LAME - 压缩 MP3 的最佳利 ... -
FLV文件格式分析(图示讲解的清楚)
2010-01-14 15:56 5120FLV是一个二进制文件, ... -
我对FLV 文件格式的理解
2010-01-14 15:52 3386我对FLV 文件格式的理解 ----------------- ... -
常用的音频文件介绍
2010-01-13 10:56 1415MP3全称是动态影像专家压缩标准音频层面3(Moving Pi ... -
RTSP客户端的JAVA实现
2010-01-12 16:12 8369参考资料 1. 《RTSP简单命 ... -
国外嵌入式、音视频处理等重要网站
2010-01-08 10:07 2050嵌入式方面: 1.关于嵌入式开发的站点,提供非常多关于嵌入 ... -
RTSP点播——消息流程实例
2010-01-08 09:44 5128RTSP点播消息流程实例(客户端:VLC, RTSP服务器:L ... -
live555代码解读之三:SETUP和PLAY请求消息处理过程
2010-01-08 09:43 3480SETUP请求消息处理过程 ... -
live555代码解读之二:DESCRIBE请求消息处理过程
2010-01-08 09:42 3820ve555代码解读之二:DESCRIBE请求消息处理过程 ... -
live555代码解读之一:RTSP连接的建立过程
2010-01-08 09:42 4452TSPServer类用于构建一个RTSP服务器,该类同时在其内 ... -
live555源代码概述
2010-01-08 09:41 3898述 liveMedia项目(http://www ... -
浅议SDP(会话描述协议)
2010-01-04 15:25 3586因为最近常常使用到SDP(会话描述协议Session Desc ...
相关推荐
"IDv2"和"IDv1"是MP3文件中的两种元数据标签,用于存储歌曲的标题、艺术家、专辑等信息。 IDv1是较早的标签版本,通常位于MP3文件的末尾。它包含4个部分:标题(30个字符)、艺术家(30个字符)、专辑(30个字符)...
总之,MP3中的ID3V1和ID3V2标签是存储音频文件元数据的重要方式,而C程序"获取MP3中的ID3V1、ID3V2信息.c"可能涉及了读取和解析这些标签的代码实现。了解并掌握这些技术,对于开发与音乐相关的软件具有重要意义。
头部包含了版本信息、大小、标志位等,而帧则包含实际的数据,如TIT2帧用于存储歌曲标题,TPE1帧存储艺术家信息,TCON帧存储曲风等。 在C++编程中,我们需要先打开MP3文件,然后定位到ID3v2标签的位置。这通常需要...
IDV(Intelligent Desktop Virtualization 智能桌面虚拟化,与云桌面技术的实现方式相似,但不属于云桌面技术)是英特尔公司提出了一种革新性的框架,它将使得管理用户计算的整个系统变得更加智能。而且能够最大化...
支持离线使用:IDV 采用的是终端虚拟化技术,桌面虚拟机运行于终端内,在网络条件差、甚至没有网络的情况下,用户仍然可以访问自己的桌面和应用。 用户体验效果好:IDV 桌面采用本地虚拟化技术,充分利用本地计算...
1. **IDV基础介绍** IDV的核心理念是提供一个集成化的环境,让用户能够快速创建和部署数据驱动的可视化应用。它支持多种数据源,包括数据库、文件、网络流数据等,可以实现数据的实时更新和动态展示。 2. **界面与...
让一排idv往下掉.html
MP3标签修改器3.3是一款专为音乐爱好者设计的实用工具,主要用于管理和优化音频文件中的元数据,尤其是针对MP3格式的文件。这款软件的独特之处在于它支持ID3v1和ID3v2两种主要的MP3标签标准,使得用户能够方便地编辑...
IDV位置定位产品解决方案是一款由IDV Solutions公司推出的创新性技术,旨在通过结合传统商业智能(BI)和地理信息系统(GIS)的优势,提供高效、直观的位置智能服务。该公司成立于2004年,总部位于美国密歇根州,是...
对于MP3文件,IDv1和IDv2是两种常见的标签版本。IDv1标签位于文件的末尾,支持的基本信息有限,不包含专辑封面;而IDv2标签则位于文件头部,提供了更丰富的元数据支持,包括多语言的标签信息和图像附件,能更好地...
IDV位置定位产品解决方案是一种创新的技术方案,旨在利用位置智能技术改变未来的数据分析和决策制定方式。IDV Solutions公司,成立于2004年,总部位于美国密歇根州,是全球领先的位置智能软件提供商,同时也是微软在...
2. **显示器**:根据管理机、教师机和学生机的配置,显示器进行1:1匹配,确保人机交互的舒适性。 3. **教师机**:可以选择与学生机相同配置,或更高配置的分体式台式机或一体机,以满足教师在教学中的高性能需求。 4...
强制修改串口idv和idp工具(可以修改全部串口出厂信息)。调试的时候串口太多,找目的串口太麻烦了,中途拔了一个后,再插一个串口找起来太累了。特此找了个修改idv和idp工具,以后调试就可以通过idv和idp找目的串口...
MP3 ID3v1中文乱码问题是在处理包含中文元数据的MP3文件时常见的一个问题,尤其是在非中文操作系统环境下。ID3v1标签是早期用于存储MP3文件元信息(如歌曲名、艺术家、专辑等)的标准,它不支持Unicode编码,只允许...
IDV适用于需要运行不同操作系统场景,如政府单位的业务系统需要在多种系统环境下运行。 VOI技术则尝试利用本地终端资源处理计算和图形密集型任务,减轻服务器压力,即使在网络中断或硬件故障时仍能继续使用。然而,...
联想商用IDV(Intelligent Desktop Virtualization)方案是联想推出的一种创新桌面计算模式,它将计算任务从本地硬件转移到中央服务器,从而实现集中管理和高效资源分配。这种模式降低了对终端设备硬件的要求,同时...
1.充分了解产品和解决方案:阅读产品白皮书,并在演示系统上直接操作,以便更好地了解联想商用IDV解决方案的功能和特点。 2.引导客户接近这个解决方案:对于新用户,简述本方案的易于低成本维护、教师的便捷教学、...
IDV是智能桌面虚拟化,包含两种模式:Windows模式和Linux模式。IDV架构可以实现一机两用,可以支持各种计算机外设以适应复杂的应用环境及未来的应用扩展。IDV解决方案的优点包括: * 可以充分利旧客户原有本地终端...
2. 获取`<div>`的尺寸和CSS样式,确保`<canvas>`的大小与`<div>`匹配。 3. 将`<div>`的内容复制到`canvas`上。这一步通常涉及将`<div>`的HTML结构转化为DOM节点,然后使用`canvas`的`drawImage()`或`drawNode()`方法...