首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[原创]利用LabWindows/CVI获得MP3的各种信息

[原创]利用LabWindows/CVI获得MP3的各种信息

前几天我发表了一些有关于音频文件的文章,但都是用来做解码的,很少涉及到信息提取问题!通过这个例子,我是想说明如何在文件系统内确定文件指针的指向问题。
  在利用LabWindows/CVI制作C语言程序时,原则上可以读取任何文件的内容。但是,用C语言读取其它文件信息时,如果遇到“\0”或者在内存中遇到“00 00”之类的字符时,会默认为结束标识符而停止继续读取,这个时候,需要调整文件的指针,使其能读取其它的数据文件。
  我们知道,一般的“*.exe”文件是以“MZ”开头的,其后一般是结束符,然后是其它的一些内容,用CVI读取时,只能读前两个字符!
  所以,如果想读取其它的信息,需要考虑一下,并适当使用一些技巧了!
  现在所读取的MP3文件包含以下内容:
  • 标题信息
  • 艺术家信息
  • 专辑信息

  用UltraEdit将一个MP3文件打开,其最后的128位为MP3的信息位,如下图所示。

  

 

程序的界面如下:

代码如下:

 

#include
#include
#include   
#include
#include "mp3info.h"

static int panelHandle;

int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow)
{
 if (InitCVIRTE (hInstance, 0, 0) == 0)
  return -1; /* out of memory */
 if ((panelHandle = LoadPanel (0, "mp3info.uir", PANEL)) < 0)
  return -1;
 DisplayPanel (panelHandle);
 RunUserInterface ();
 DiscardPanel (panelHandle);
 return 0;
}

//打开按钮
int CVICALLBACK OkCallback (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 int status;
 char path[MAX_PATHNAME_LEN];
 long filesize = 0;
 int filehandle;
 char *buffer;
  
 switch (event)
 {
  case EVENT_COMMIT:
   status = FileSelectPopup ("", "*.mp3", "*.mp3", "打开MP3文件", VAL_LOAD_BUTTON, 0, 1, 1, 1, path);
   if (status > 0)
   {
    //打开文件
    filehandle = OpenFile (path, VAL_READ_ONLY, VAL_OPEN_AS_IS, VAL_BINARY);
    
    //获得文件的大小
    GetFileInfo (path, &filesize);
    
    //动态分配内存,以存储MP3信息
    buffer = malloc (128 * sizeof(char)+1);
    
    //初始化内存
    buffer[0] = '\0';
    
    //获得标题信息  TAG从倒数128位开始,内容从倒数125开始 
    //定位文件指针
    SetFilePtr (filehandle, filesize-125, 0);
    
    //读取文件
    ReadFile (filehandle, buffer, 31);
    
    //文件最后加上结束符
    buffer[30] = '\0';
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "标题:");
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, buffer);
    
    //获得艺术家信息
    buffer[0] = '\0';
    status = SetFilePtr (filehandle, filesize-95, 0);
    ReadFile (filehandle, buffer, 32);
    buffer[31] = '\0'; 
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "艺术家:");
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, buffer);
    
    //获得专辑信息
    buffer[0] = '\0';
    status = SetFilePtr (filehandle, filesize-65, 0);
    ReadFile (filehandle, buffer, 31);
    buffer[30] = '\0'; 
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "专辑:"); 
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, buffer);
    
    //内容分隔符
    InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "------------------------------------"); 
    
    //释放内存
    free(buffer);
    
    //关闭文件
    CloseFile (filehandle);
   }

   break;
 }
 return 0;
}

//退出按钮
int CVICALLBACK QuitCallback (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 switch (event)
 {
  case EVENT_COMMIT:
   QuitUserInterface (0);
   break;
 }
 return 0;
}

转自:小信的博客
网址:http://blog.sina.com.cn/u/1265070197

返回列表