今天晚上对音乐识别码作了调整,发现采样的时间不能太短,但想达到快速匹配就要尽量压短时间,理论上采样点越多每个点的权值就越低,容错度就越高结果的精确度就高。
还是昨天的结果
0x0000110001111111
0x0000100001111112
0x0000100001111111
三个不同的格式不同采样的歌曲还是在个别地方有很大的不同不过我想到了一个简单的解决办法
100010000000000000001000100010001000100010001
100000000000000000001000100010001000100010010==2
100000000000000000001000100010001000100010001==1
转换成2进制作按位与 & 。然后统计结果中1的个数,算出最亲近的识别码。这点计算量对服务器来说微不足道。
下面是识别码产生的主要代码贴到wmaPlay例子里就可以用了。
#define FREQUENCY 5
BOOL CWavePlayer::Play(BYTE * inData, DWORD inLength, QWORD inSampleTime)
{
int begin = 0;
if (mLoop < 12) {
for (UINT32 loop = 0; loop < inLength; loop++ ){
if (mWaveFormat->nChannels == 1) {
if (mWaveFormat->wBitsPerSample == 8) {
mSum += abs(inData[loop]);
mCount++;
}
if (mWaveFormat->wBitsPerSample == 16) {
if ((loop + 1) % 2 == 1) {
short tdata;
memcpy(&tdata, (inData + loop), 2);
mSum += abs(tdata);
mCount++;
}
}
}else{
if (mWaveFormat->wBitsPerSample == 8) {
if ((loop + 1) % 2 == 1) {
short tdata;
mSum += abs(inData[loop]);
mCount++;
}
}
if (mWaveFormat->wBitsPerSample == 16) {
if ((loop + 1) % 4 == 1) {
short tdata;
memcpy(&tdata, (inData + loop), 2);
mSum += abs(tdata);
mCount++;
}
}
}
// sur.sun[4/29/2007] 划分为8份
if ((mCount * (mWaveFormat->wBitsPerSample / 8) * mWaveFormat->nChannels) == mWaveFormat->nAvgBytesPerSec * FREQUENCY) {
double coef;
if (mWaveFormat->wBitsPerSample == 8) {
coef = 16.00;
}
if (mWaveFormat->wBitsPerSample == 16) {
coef = 4096.00;
}
double temp = mSum / (mCount * coef);
mSum = 0;
mCount = 0;
if (abs(temp) == 0) {
if (mLoop == 0) {
begin ++;
loop = (mWaveFormat->nSamplesPerSec * FREQUENCY / 8 - 1) * begin;
continue;
}
}
mLoop++;
mAvg = mAvg << 4;
mAvg += abs(temp);//sur.sun[4/29/2007]产生的识别码在mAvg里面
}
}
}else{
// sur.sun[4/29/2007]
}
工作算告一段落了,理论上是解决了这个问题,但没有做大规模测试估计结果也没什么商业意义。
代码可以使用,但要是你用于商业目的请先征求我的同意








