我试图从一个文件中提取mp3头。这与id 3标签不同-mp3头是保存MPEG版本,比特率,频率等信息的地方。
您可以在此处查看mp3标头结构的概述:http://upload.wikimedia.org/wikipedia/commons/0/01/Mp3filestructure.svg
我的问题是,尽管加载了文件,现在收到了有效的(据我所知)二进制输出,但我没有看到预期的值。mp3文件的前12位应该都是1,作为mp3同步字。然而,我收到的前8位却不同。这对我来说意味着一个问题。
作为一个侧记,我有一个有效的mp3文件通过fopen附加
// Main function
int main (void)
{
// Declare variables
FILE *mp3file;
char requestedFile[255] = "";
unsigned long fileLength;
// Counters
int i;
// Tryout
unsigned char byte; // Read from file
unsigned char mask = 1; // Bit mask
unsigned char bits[8];
// Memory allocation with malloc
// Ignore this at the moment! Will be used in the future
//mp3syncword=(unsigned int *)malloc(20000);
// Let's get the name of the file thats requested
strcpy(requestedFile,"testmp3.mp3"); // lets hardcode this into here for now
// Open the file
mp3file = fopen(requestedFile, "rb"); // open the requested file with mode read, binary
if (!mp3file){
printf("Not found!"); // if we can't find the file, notify the user of the problem
}
// Let's get some header data from the file
fseek(mp3file,0,SEEK_SET);
fread(&byte,sizeof(byte),1,mp3file);
// Extract the bits
for (int i = 0; i < sizeof(bits); i++) {
bits[i] = (byte >> i) & mask;
}
// For debug purposes, lets print the received data
for (int i = 0; i < sizeof(bits); i++) {
printf("Bit: %d\n",bits[i]);
}
7条答案
按热度按时间wtzytmuj1#
ID3v2占用MP3文件的第一位(如果存在的话)。文件的前三个字节将是“ID3”:
http://www.id3.org/id3v2.4.0-structure
有两种方法可以解决这个问题,第一种方法是检查ID3标签是否存在,然后解析10字节的标签头,并跳过这个字节。
编辑:如果解析页眉,您需要检查Flags字段中的第4位是否设置为1,如果是,您需要跳过额外的10个字节以越过页脚。
或者你可以只通过MP3寻找,直到你击中同步模式。ID3v2的设置方式,11位一行不应该出现,以确保与不支持它的播放器兼容。
twh00eeo2#
ID3信息可能在前。前3个字符是否为
ID3
?icomxhvb3#
跳过文件的第一个字节有什么原因吗?
myzjeezk4#
尝试
代替
文件从字节位置0开始。
l7mqbcuq5#
我想你可能想
k4emjkb16#
fseek(mp3file,1,SEEK_SET);
使您跳过前8位,因此您使用fread得到的是第9到16位wlsrxk517#
这种方法对我很有效,但是我必须删除
//counter
下的int i;
这可能是你需要做的。所有的位打印1。