如何得到一个音频文件的播放时间长度?

时间:2022-07-03 19:43:35
不要用MCI_Statue查询,因为要这样的话,必须先打开设备,然后才能查询,最后还要关闭设备。我想要的效果就像Mediaplay一样,只要把声音文件加入到播放器中很快就能得到这个声音文件的时间长度。

我试着做一个简单的播放器,但是在获取时间升序时,遇到这点麻烦。我要播放的是mid,wav.mp3就这几种了。

期待着你的回复。谢谢。

9 个解决方案

#1


>100KB还是用mci或是DirectX吧
如DirectSound的wavefile 类的函数GetDataSize 
Returns the total number of wave data bytes. 

就是你要的, 当然不全, :)

#2


你那播发器是用控件做的么?
要是控件做的,里面有查时间的函数.

#3


音频文件的格式确定,可看文件大小。

#4


GetDataSize 
得到文件字节数, 然后GetAvgDataRate得到平均速率 , 就可以得到时间了

#5


puyinghua(不尔) :
谢谢你的方法,但是我这不用DirectX.

 shesh(无所谓) 
我是用MCI做的,不是用控件的。


 CAYU(中原):
能把你的方法告诉我吗?我要怎么才能得到文件大小和时间长短的关系呢?

谢谢各位的帮忙。

#6


DWORD MCIMP3::MCIGetLength(DWORD *dwLength)
{
MCI_STATUS_PARMS mciSP;

mciSP.dwItem=MCI_STATUS_LENGTH;
DWORD dwReturn=mciSendCommand(m_wID, MCI_STATUS, MCI_STATUS_ITEM,
(DWORD)(LPVOID)&mciSP);
if (dwReturn==0)
*dwLength=mciSP.dwReturn/1000;
return dwReturn;
}

#7


AthlonxpX86(一滴水) :
谢谢你的回复,对于一个音乐文件这种方法还能忍受,但是五个音乐文件时,要近半分钟的时间才能得到结果。太慢了,
我想要一种快速得到音频文件的播放长度时间的方法。

#8


aqua_aqua(丁丁) :
你能具体说一下你做的什么软件吗?
假如是带列表的播放软件,想像winamp那样打开列表时间非常快,
那就不能用这种方法,因为winamp是事先计算好时间,保存M3U列表时把这些数据保存到列表文件,打开列表时只要从列表文件读出数据(时间数据),
另外,还有一个快速的方法,但我觉得不好,不过如果你了解文件格式,它还真是个好办法。(几十个文件只需两三秒)
        
         CFileStatus rStatus;
DWORD dwLength=0;
         CFile::GetStatus(strPath, rStatus))
dwLength=(DWORD)(rStatus.m_size/16000);
         //文件尺寸除以数据流速(以128kbps的mp3为例128kbps/8=16000)
CString strLength;
strLength.Format("%d:%02d", dwLength/60, dwLength%60);
m_Length = strLength;

#9


AthlonxpX86(一滴水) :
谢谢你的建议,我现在已经用你说那种方法了。只是试验一下,还不知道速度呢,不过肯定比用MCI快。
我做的哪是什么软件呀?只是老师说要这么个具有这种功能的东西 ,那我就做了。现在已经能得到wav文件格式的时间长度了。接下来是midi了,读了一下午的MIDI,读是读出来了,就是不知道怎么计算时间长度。

#1


>100KB还是用mci或是DirectX吧
如DirectSound的wavefile 类的函数GetDataSize 
Returns the total number of wave data bytes. 

就是你要的, 当然不全, :)

#2


你那播发器是用控件做的么?
要是控件做的,里面有查时间的函数.

#3


音频文件的格式确定,可看文件大小。

#4


GetDataSize 
得到文件字节数, 然后GetAvgDataRate得到平均速率 , 就可以得到时间了

#5


puyinghua(不尔) :
谢谢你的方法,但是我这不用DirectX.

 shesh(无所谓) 
我是用MCI做的,不是用控件的。


 CAYU(中原):
能把你的方法告诉我吗?我要怎么才能得到文件大小和时间长短的关系呢?

谢谢各位的帮忙。

#6


DWORD MCIMP3::MCIGetLength(DWORD *dwLength)
{
MCI_STATUS_PARMS mciSP;

mciSP.dwItem=MCI_STATUS_LENGTH;
DWORD dwReturn=mciSendCommand(m_wID, MCI_STATUS, MCI_STATUS_ITEM,
(DWORD)(LPVOID)&mciSP);
if (dwReturn==0)
*dwLength=mciSP.dwReturn/1000;
return dwReturn;
}

#7


AthlonxpX86(一滴水) :
谢谢你的回复,对于一个音乐文件这种方法还能忍受,但是五个音乐文件时,要近半分钟的时间才能得到结果。太慢了,
我想要一种快速得到音频文件的播放长度时间的方法。

#8


aqua_aqua(丁丁) :
你能具体说一下你做的什么软件吗?
假如是带列表的播放软件,想像winamp那样打开列表时间非常快,
那就不能用这种方法,因为winamp是事先计算好时间,保存M3U列表时把这些数据保存到列表文件,打开列表时只要从列表文件读出数据(时间数据),
另外,还有一个快速的方法,但我觉得不好,不过如果你了解文件格式,它还真是个好办法。(几十个文件只需两三秒)
        
         CFileStatus rStatus;
DWORD dwLength=0;
         CFile::GetStatus(strPath, rStatus))
dwLength=(DWORD)(rStatus.m_size/16000);
         //文件尺寸除以数据流速(以128kbps的mp3为例128kbps/8=16000)
CString strLength;
strLength.Format("%d:%02d", dwLength/60, dwLength%60);
m_Length = strLength;

#9


AthlonxpX86(一滴水) :
谢谢你的建议,我现在已经用你说那种方法了。只是试验一下,还不知道速度呢,不过肯定比用MCI快。
我做的哪是什么软件呀?只是老师说要这么个具有这种功能的东西 ,那我就做了。现在已经能得到wav文件格式的时间长度了。接下来是midi了,读了一下午的MIDI,读是读出来了,就是不知道怎么计算时间长度。