急……急……急……VC中利用MCI 获取MP3歌曲的准确时间的方法?

TxiaojunT 2009-10-13 09:46:32
我用MCIWndGetLength()来获取MP3的准备时间,我调试过,一首歌曲的真实时间长度是3:55,但通过该函数得到的值为356127 (单位是毫秒),取前三位 356 (秒),即该首歌曲时间长度为 5:56, 这比真实的时间长度上了很多,找不到原因了,因此求各位高手多多指导指导!小弟不胜感激!愿高分奉上!能给出 准确获取MP3时间长度的方法为最好!急!急!急!

关键代码:
LONG m_lMusicLength;// 歌曲的长度
HWND m_hVideo;


MCIWndUseTime(m_hVideo);
m_lMusicLength = MCIWndGetLength(m_hVideo);
...全文
1042 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fesito 2012-02-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jerry_zjnb 的回复:]
我也发现了,不过我发现文件比特率为128,160,192,256,320这些标准比特率的文件得到的时长是正确的!

我倒是有一种方法,通过文件大小跟比特率去得到时长,不过没试过!
[/Quote]
不好意思,上一次我引用错了,是这种方法!
fesito 2012-02-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dm569263708 的回复:]
有的文件获取的时间不准确,并且差好多
[/Quote]
这种方法可以,不过要注意区分开数据和一些文件信息。
lcy_888 2011-10-02
  • 打赏
  • 举报
回复
高手如林,正好在此学习了。
jerry_zjnb 2011-10-01
  • 打赏
  • 举报
回复
我也发现了,不过我发现文件比特率为128,160,192,256,320这些标准比特率的文件得到的时长是正确的!

我倒是有一种方法,通过文件大小跟比特率去得到时长,不过没试过!
那一片海 2011-04-27
  • 打赏
  • 举报
回复
有的文件获取的时间不准确,并且差好多
xylicon 2009-10-14
  • 打赏
  • 举报
回复
#include <windows.h> 
#include <stdio.h>
#include <mmsystem.h>
#include <shellapi.h>
#include <AFXCOM_.H>

#pragma comment(lib,"winmm.lib")
unsigned long getmusictime(char *s)//利用MCI命令,*S为文件名,返回值为文件时间的秒数
{
unsigned long m_dLength;
int m_wDeviceID;
char buf[128];
MCI_OPEN_PARMS mciOpen;

MCI_STATUS_PARMS mciStatusParms;
MCIERROR mciError;
mciOpen.lpstrElementName=(LPCTSTR)s;//取得文件名
mciError=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpen);//打开文件
if(mciError) //出错处理
{
mciGetErrorString(mciError,buf,128);
printf("%s\n",buf);
getchar();
}
m_wDeviceID=mciOpen.wDeviceID;

mciStatusParms.dwItem=MCI_STATUS_LENGTH;
mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);//关键,取得长度
m_dLength=mciStatusParms.dwReturn;
mciSendCommand(m_wDeviceID,MCI_CLOSE,0,NULL);//关闭文件
return m_dLength;
}


void main()

{
char *filename="E:\\Music\\原谅我一次.mp3";//filename 为实际的文件名
cout<<getmusictime(filename)<<endl; //调用上面的getmuisctime()
unsigned long time=getmusictime(filename);
unsigned long temp=time/1000;//毫秒换成秒,我的小学数学基础扎实
cout<<temp/3600;//这里开始输出HH:MM:SS(时分秒格式)
cout<<':';
temp=temp%3600;
cout<<temp/60;
temp=temp%60;
cout<<':';
cout<<temp;
cout<<endl;
getchar();

}


转自:http://blog.163.com/jacknes009/blog/static/2810542320083225401887/
fishion 2009-10-14
  • 打赏
  • 举报
回复
好像是微软早就不对MCI进行更新支持了,所以对获得MP3时间的功能已不再准确了,也就是说要获得MP3准确时间就不能用MCI的API了
xylicon 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
float  CVidFileSendDlg::GetMovieDuration(LPCSTR  sMovieName) 
  { 
  HRESULT hr; 
  double MovieDuration  ; 
          IGraphBuilder *pigb; 
          IMediaPosition *pims    =  NULL; 
   
          CoInitialize(NULL); 
          hr  =  CoCreateInstance(CLSID_FilterGraph,  //  get  this  documents  graph  object 
                                                      NULL, 
                                                      CLSCTX_INPROC_SERVER, 
                                                      IID_IGraphBuilder, 
                                                      (void  **)  &pigb); 
   
          if  (FAILED(hr)) return  -1; 
   
          WCHAR  wFile[512]; 
          MultiByteToWideChar(  CP_ACP,  0,  (LPCSTR)sMovieName,  -1,  wFile,  512  ); 
          hr  =  pigb->RenderFile(wFile,  NULL); 
          pigb->QueryInterface(IID_IMediaPosition,  (void  **)&pims); 
  pims->get_Duration(&MovieDuration); 
  pims->Release(); 
  pigb->Release();   
  CoUninitialize(); 
   
  return  (float)MovieDuration  ; 
  } 
 
[/Quote]

这个貌似是DirectShow的方法吧。不是MCI啊。
xmrforever 2009-10-13
  • 打赏
  • 举报
回复
mark
oyljerry 2009-10-13
  • 打赏
  • 举报
回复
float CVidFileSendDlg::GetMovieDuration(LPCSTR sMovieName)
{
HRESULT hr;
double MovieDuration ;
IGraphBuilder *pigb;
IMediaPosition *pims = NULL;

CoInitialize(NULL);
hr = CoCreateInstance(CLSID_FilterGraph, // get this documents graph object
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void **) &pigb);

if (FAILED(hr)) return -1;

WCHAR wFile[512];
MultiByteToWideChar( CP_ACP, 0, (LPCSTR)sMovieName, -1, wFile, 512 );
hr = pigb->RenderFile(wFile, NULL);
pigb->QueryInterface(IID_IMediaPosition, (void **)&pims);
pims->get_Duration(&MovieDuration);
pims->Release();
pigb->Release();
CoUninitialize();

return (float)MovieDuration ;
}

Top

13 楼JennyVenus()回复于 2003-02-08 12:50:16 得分 0 mp3文件最后的128个字节
typedef struct {
char tag[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comments[30];
char genre;
}MP3_TAILER;

YeBinYe 2009-10-13
  • 打赏
  • 举报
回复
顶一个,楼主可以上PUDN:htttp://www.pudn.com程序员开发网,里面关于这方面的代码很多!
快乐鹦鹉 2009-10-13
  • 打赏
  • 举报
回复
百度搜索这么说:
去http://www.codeproject.com/
搜寻ID3,
有不少范例会有音乐长度,
用你说会有错误的音乐去试试看,
能取得正确的话就用那范例的方法.

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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