我试着做一个简单的播放器,但是在获取时间升序时,遇到这点麻烦。我要播放的是mid,wav.mp3就这几种了。
期待着你的回复。谢谢。
9 个解决方案
#1
>100KB还是用mci或是DirectX吧
如DirectSound的wavefile 类的函数GetDataSize
Returns the total number of wave data bytes.
就是你要的, 当然不全, :)
如DirectSound的wavefile 类的函数GetDataSize
Returns the total number of wave data bytes.
就是你要的, 当然不全, :)
#2
你那播发器是用控件做的么?
要是控件做的,里面有查时间的函数.
要是控件做的,里面有查时间的函数.
#3
音频文件的格式确定,可看文件大小。
#4
GetDataSize
得到文件字节数, 然后GetAvgDataRate得到平均速率 , 就可以得到时间了
得到文件字节数, 然后GetAvgDataRate得到平均速率 , 就可以得到时间了
#5
puyinghua(不尔) :
谢谢你的方法,但是我这不用DirectX.
shesh(无所谓)
我是用MCI做的,不是用控件的。
CAYU(中原):
能把你的方法告诉我吗?我要怎么才能得到文件大小和时间长短的关系呢?
谢谢各位的帮忙。
谢谢你的方法,但是我这不用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;
}
{
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;
你能具体说一下你做的什么软件吗?
假如是带列表的播放软件,想像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,读是读出来了,就是不知道怎么计算时间长度。
谢谢你的建议,我现在已经用你说那种方法了。只是试验一下,还不知道速度呢,不过肯定比用MCI快。
我做的哪是什么软件呀?只是老师说要这么个具有这种功能的东西 ,那我就做了。现在已经能得到wav文件格式的时间长度了。接下来是midi了,读了一下午的MIDI,读是读出来了,就是不知道怎么计算时间长度。
#1
>100KB还是用mci或是DirectX吧
如DirectSound的wavefile 类的函数GetDataSize
Returns the total number of wave data bytes.
就是你要的, 当然不全, :)
如DirectSound的wavefile 类的函数GetDataSize
Returns the total number of wave data bytes.
就是你要的, 当然不全, :)
#2
你那播发器是用控件做的么?
要是控件做的,里面有查时间的函数.
要是控件做的,里面有查时间的函数.
#3
音频文件的格式确定,可看文件大小。
#4
GetDataSize
得到文件字节数, 然后GetAvgDataRate得到平均速率 , 就可以得到时间了
得到文件字节数, 然后GetAvgDataRate得到平均速率 , 就可以得到时间了
#5
puyinghua(不尔) :
谢谢你的方法,但是我这不用DirectX.
shesh(无所谓)
我是用MCI做的,不是用控件的。
CAYU(中原):
能把你的方法告诉我吗?我要怎么才能得到文件大小和时间长短的关系呢?
谢谢各位的帮忙。
谢谢你的方法,但是我这不用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;
}
{
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;
你能具体说一下你做的什么软件吗?
假如是带列表的播放软件,想像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,读是读出来了,就是不知道怎么计算时间长度。
谢谢你的建议,我现在已经用你说那种方法了。只是试验一下,还不知道速度呢,不过肯定比用MCI快。
我做的哪是什么软件呀?只是老师说要这么个具有这种功能的东西 ,那我就做了。现在已经能得到wav文件格式的时间长度了。接下来是midi了,读了一下午的MIDI,读是读出来了,就是不知道怎么计算时间长度。