通过fopen访问C语言中的二进制MP3头

zlhcx6iw  于 2022-12-03  发布在  其他
关注(0)|答案(7)|浏览(164)

我试图从一个文件中提取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]);
    }
wtzytmuj

wtzytmuj1#

ID3v2占用MP3文件的第一位(如果存在的话)。文件的前三个字节将是“ID3”:
http://www.id3.org/id3v2.4.0-structure
有两种方法可以解决这个问题,第一种方法是检查ID3标签是否存在,然后解析10字节的标签头,并跳过这个字节。
编辑:如果解析页眉,您需要检查Flags字段中的第4位是否设置为1,如果是,您需要跳过额外的10个字节以越过页脚。
或者你可以只通过MP3寻找,直到你击中同步模式。ID3v2的设置方式,11位一行不应该出现,以确保与不支持它的播放器兼容。

twh00eeo

twh00eeo2#

ID3信息可能在前。前3个字符是否为ID3

icomxhvb

icomxhvb3#

fseek(mp3file,1,SEEK_SET);

跳过文件的第一个字节有什么原因吗?

myzjeezk

myzjeezk4#

尝试

fseek(mp3file,0,SEEK_SET)

代替

fseek(mp3file,1,SEEK_SET).

文件从字节位置0开始。

l7mqbcuq

l7mqbcuq5#

我想你可能想

fseek(mp3file,0,SEEK_SET);
k4emjkb1

k4emjkb16#

fseek(mp3file,1,SEEK_SET);使您跳过前8位,因此您使用fread得到的是第9到16位

wlsrxk51

wlsrxk517#

这种方法对我很有效,但是我必须删除//counter下的int i;
这可能是你需要做的。所有的位打印1。

相关问题