gpt4 book ai didi

c - 通过 fopen 在 C 中访问二进制 MP3 header

转载 作者:行者123 更新时间:2023-12-01 23:22:58 25 4
gpt4 key购买 nike

我正在尝试从文件中提取 mp3 header 。这与 ID3 标签不同——mp3 header 保存有关 MPEG 版本、比特率、频率等信息。

您可以在此处查看 mp3 header 结构的概述:http://upload.wikimedia.org/wikipedia/commons/0/01/Mp3filestructure.svg

我的问题是,尽管加载了文件并且现在收到了有效的(据我所知)二进制输出,但我没有看到预期的值。对于 mp3 同步字,mp3 文件的前 12 位应全为 1。然而,仅前 8 位我就收到了不同的信息。这会给我带来一个问题。

顺便说一句,我有一个通过 fopen 附加的有效 mp3 文件

// 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]);
}

最佳答案

ID3v2 占据 MP3 文件的第一位(如果存在)。文件的前三个字节将为“ID3”:

http://www.id3.org/id3v2.4.0-structure

有两种处理方法。第一个是检查 ID3 标签是否存在,然后解析 10 字节 header 以了解标签大小,并向前跳过那么多字节。

编辑:如果解析 header ,您需要检查 Flags 字段中的第 4 位是否设置为 1,如果是,则需要跳过额外的 10 个字节以越过页脚。

或者您可以直接搜索 MP3,直到达到同步模式。 ID3v2的设置方式,不应该出现连续11位,以保证与不支持的播放器的兼容性。

关于c - 通过 fopen 在 C 中访问二进制 MP3 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com