经过更多研究,它似乎是一个专有的高性能SQL数据库,旨在用于嵌入式应用程序。 (经过更多研究后,该数据库称为“ DeviceSQL”。请阅读原始作者Quora的相关文章)。看起来好像不太容易逆向操作:(
对于任何其他希望从其rekordbox库中提取BPM信息的人:事实证明,可以使用XML导出。虽然不像读取数据库文件那样自动化,但它是一种很好的标准格式!
老问题: (数据库只是这些文件的目录树)。这是示例轨道[4]的一对文件。该轨道的BPM被检测为170,尽管我怀疑它将其存储为浮点或可以像“ 169.96”这样的数字检测到其他轨道的两倍。尽管寻找双精度和浮点十六进制表示形式对我来说没有任何匹配。我看到文件的标题看起来像,例如“ PPTH”,后跟文件路径。和“ PQTZ”,用于Rekordbox量化功能。但是我对文件格式不太熟悉,因此无法确定它是否使用标准文件类型。或更专有的东西。
如果有人有兴趣查看文件并为我指出正确的方向,将不胜感激!现在,我只是想弄清楚BPM的存储方式。
由于我的信誉不够,我最多只能提供一个链接:(以上括号中的参考链接:https://gist.github.com/EvanPurkhiser/72b37edd4a6ea26fbe73
#1 楼
精确的BPM实际上位于数据文件(文件名).DAT中(可能整个BPM位于edb中。但是我无法确认) >file.DAT -------- /numbers are all big endian/ [tag] - 4 byte string 4byte - tag header size 4byte - segment size (including tag header) (in multibit fields, msb-to-lsb (left-to-right) is the general direction) ////////////////////////////// PMAI - main file descriptor 4byte - head size (28) 4byte - total file size 4byte - ??? (1) 4byte - ??? (65536) 4byte - ??? (65536) 4byte - ??? (0) PPTH - file path 4byte - head size (16) 4byte - tag size 4byte - data length data_bytes - file path in UTF16 (big endian) q4312078q terminated PVBR - VBR seek table 4byte - head size (16) 4byte - tag size (1620) (4*400+4) 4byte - 0 >entries> 4byte - file pos >last_entry> 4byte - ??? PQTZ - Quantized time zones 4byte - head size (24) 4byte - tag size 4byte - 0 4byte - ??? (524288=0x80000) 4byte - number of entries >entries> 2byte - beat phase (1-2-3-4) 2byte - bpm*100 4byte - time index (msec) PWAV - Low resolution Wave display data (5+3bit) 4byte - head size (20) 4byte - tag size (420) 4byte - data size (400) 4byte - ??? (65536) >entries> 3bit - color index 5bit - height PWV2 - Lowest resolution Wave display data (4bit) 4byte - head size (20) 4byte - tag size (120) 4byte - data size (100) 4byte - ??? (65536) >entries> 4bit - 0 4bit - height PCOB - CUE Object ///first PCOB for hot cues, second PCOB for memory ///only generated for USB storage, ///otherwise contains only dummy data and actual cue data stored in the edb 4byte - head size (24) 4byte - tag size 4byte - hotCUE? (1=hot cue, 0=memory) 4byte - number of cue points 4byte - memories (-1= hot cue) >entry tags> PCPT - CUE Point 4byte - head size (28) 4byte - tag size (56) 4byte - hot cue no#, 0 otherwise 4byte - active (0=inactive / 4=active) 4byte - (65536) 4byte - ???? -----point type: 0xffff ffff = hot cue //// memory first: 0xffff xxxxx ----- memory last: 0x xxxx ffff >datas> 1byte - cue type 1 = single / 2 = loop 1byte - 0 2byte - ??? (1000) 4byte - start time (msec) 4byte - loop end (-1 if not used) 16byte - 0 file.EXT -------- PMAI - main file descriptor 4byte - head size (28) 4byte - total file size 4byte - ??? (1) 4byte - ??? (65536) 4byte - ??? (65536) 4byte - ??? (0) PPTH - file path 4byte - head size (16) 4byte - tag size 4byte - data length data_bytes - file path in UTF16 (big endian) q4312078q terminated PWV3 - High resolution Wave display data 4byte - head size (24) 4byte - tag size 4byte - ??? (1) 4byte - data size 4byte - ??? (0x0096 0000) >entries> 3bit - color 5bit - height
当我倒车时,文件中没有PKEY,所以我不知道它的用途(并且PC上似乎只有0)
因此BPM值存储在PQTZ标签中(在动态模式下,同一首歌曲中您可以具有不同的BPM,因此很有意义)
#2 楼
如您所知,文件格式似乎由带有标签的标头组成。这些标头中的每一个似乎都是16+字节,其中4个字节是标签,4个字节是标头的长度,4个字节是标头+数据的大小,另外4个我不确定。不幸的是,这些长度字节是big endian,这使我认为bpm也可以存储在big endian IEEE float中,这可能是您找不到任何东西的原因。 PMAI。似乎是某种信封(它的长度字段是文件本身的大小),其余头似乎是各种形式的数据内容。我写了一个小程序来转储该节名称和长度(请不要以它为例来说明样式!):
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char **argv) {
analyze(argv[1]);
}
int analyze(char *filename) {
FILE *fp;
struct {
char tag[4];
int x0;
int x1;
int x2;
} header;
int length;
if ((fp=fopen(filename, "rb"))==NULL) {
perror(filename); return;
}
while (fread(&header, sizeof header, 1, fp)) {
header.x0=ntohl(header.x0);
header.x1=ntohl(header.x1);
header.x2=ntohl(header.x2);
printf("%04x %4.4s: %08x (%06d) | %08x (%06d) | %08x (%06d)\n",
ftell(fp)-sizeof(header),
header.tag,
header.x0, header.x0,
header.x1, header.x1,
header.x2, header.x2
);
if (!memcmp(header.tag, "PMAI", 4)) { // outer container
length=header.x0; // just skip header
} else if (!memcmp(header.tag, "PPTH", 4)) {
int i;
for (i=0; i<header.x2; i+=2) {
getc(fp);
putchar(getc(fp));
}
putchar('\n');
continue;
} else {
length=header.x1; // else skip data
}
fseek(fp, length-sizeof(header), 1);
}
}
因此,PMAI是容器。 PPTH是MP3文件的名称。 PVBR可能是有关可变比特率,PQTZ量化以及PWAV,PWV2和PWV3各种波形的信息。这仅使PCOB和PKEY可能包含比特率。不幸的是,如果您看一下以下内容的十六进制转储:这些都不是170。
本文说“如果rekordbox在启动时崩溃,请将database.backup.edb重命名为database.edb,如果仍然崩溃,请删除所有数据文件” 。由于BPM似乎没有存储在ANLZ。*文件中-您也有database.edb吗? BPM可以存储在这里吗?
#3 楼
Microsoft的可扩展存储引擎(ESE)使用EDB格式为许多应用程序和服务(Exchange,Active Directory,桌面搜索,Windows Live Mail等)提供存储后端。尽管EDB格式本身未记录,但Windows API很好地支持了该格式。您想要做的是以人类可读的方式浏览EDB文件的内容,EseDbViewer工具非常好。
评论
嗨-我知道这个答案如果5岁,所以我不希望很多信息仍然有用。我只想对OP进行类似的操作,但我想破解Rekordbox中的播放列表数据。您是否对哪个文件有此想法以及最佳的读取方式有什么想法?
–叶夫根尼·辛金(Yevgeny Simkin)
9月1日下午3:56
评论
谢谢!我觉得没有意识到它可以存储在其他地方有些愚蠢。该软件可让您设置存储分析数据的路径,但始终将其edb文件粘贴在用户AppData中。无论如何,edb文件看起来绝对是包含BPM的文件,正如我所看到的(看起来像字段定义)名为“ BPM”。这是edb文件。做一些研究,似乎扩展名通常用于MS Outlooks“ Exchange Databse”文件,但这似乎很愚蠢。
–埃文·普赫塞(Evan Purkhiser)
2014年5月11日21:53
因此,edb文件不是开放格式。
–埃文·普赫塞(Evan Purkhiser)
2014年5月11日在22:04
哇,埃文(Evan),自您提出这个问题以来,我们已经走了很长一段路(当我初次听到您的声音时,我才意识到是您提出了这个问题-在开始导致痢疾的研究时就曾见过) )。我们已经很好地弄清楚了有线协议,可以直接从网络上的先锋硬件收集这些数据。有关详细信息,请参见github.com/brunchboy/dysentery/blob/master/doc/Analysis.pdf,但我仍然希望能够对拇指驱动器上的文件进行离线分析。我们需要的是有人找出元数据的edb文件。有希望吗
–詹姆斯·埃利奥特(James Elliott)
2015年6月9日14:17
嗨,詹姆斯,我想提供帮助,因为我已经开始进行一些倒车,但由于时间和动力不足而放弃了。如您所知,EDB是一种数据库格式(deviceSQL),可以在很久以前尝试使用,但是以后没有了(在任何地方都找不到程序)。如上所述,大多数元数据都在file.DAT和file.EXT中。我的所有研究都完全是黑盒,因此完全合法(AFAIK)。
– CodeKiller
17年6月27日在16:10
那太好了!目前,正在运行的节目要使用元数据和全套CDJ的人们需要在DJ将相同的媒体装载到所有CDJ之前,通过网络从CDJ缓慢收集所有元数据。可以在演出前直接从记忆棒中读取它,这将是巨大的帮助。
–詹姆斯·埃利奥特(James Elliott)
17年7月7日在16:07