原创文|Space9
首先我们发现猫耳FM音频是没有后缀名的音频文件,然后我们通过对比发现猫耳FM音频文件并不是什么加密文件,只是将音频文件、封面图片、弹幕文件合并到了一起(导致其他音频播放器无法识别音频)。
我们要分离中间部分的音频文件需要获得以下两个信息(文件的开头和结尾)。
#include
#include
#include
#include
#define CHUNK_SIZE 4096
#define HEADER_SIZE 12
int main(int argc, const char *argv[])
{
FILE *inFp = NULL;
FILE *outFp = NULL;
uint32_t remaining_size;
unsigned long i;
char buff[CHUNK_SIZE];
char file_header[HEADER_SIZE];
uint32_t file_start_addr, file_size;
if (argc <= 1)
{
printf("no input file\n");
return 0;
}
char targetName[strlen(argv[1]) + 10];
strncpy(targetName, argv[1], strlen(argv[1]));
inFp = fopen(argv[1], "rb");
if (inFp == NULL)
{
printf("open file fail\n");
exit(1);
}
fseek(inFp, 20, SEEK_SET);
fread(&file_start_addr, 1, sizeof(file_start_addr), inFp);
printf("start:%d\n", file_start_addr);
fseek(inFp, 40, SEEK_SET);
fread(&file_size, 1, sizeof(file_size), inFp);
printf("end:%ld\n", file_size);
fseek(inFp, file_start_addr, SEEK_SET);
fread(&file_header, HEADER_SIZE, 1, inFp);
if ((file_header[0] == 0x49 && file_header[1] == 0x44 && file_header[2] == 0x33) || (file_header[0] == 0xFF && file_header[1] == 0xfb))
{
printf("MP3 file\n");
strcat(targetName, ".mp3");
}
else if ((file_header[4] == 0x66 && file_header[5] == 0x74 && file_header[6] == 0x79 && file_header[7] == 0x70 && file_header[8] == 0x4D && file_header[9] == 0x34 && file_header[10] == 0x41) || (file_header[0] == 0x4D && file_header[1] == 0x34 && file_header[2] == 0x41 && file_header[3] == 0x20))
{
printf("M4A file\n");
strcat(targetName, ".m4a");
}
else
{
printf("OTHER file\n");
strcat(targetName, ".temp");
}
outFp = fopen(targetName, "wb");
if (outFp == NULL)
{
printf("open file fail\n");
exit(1);
}
fseek(inFp, file_start_addr, SEEK_SET);
remaining_size = file_size % CHUNK_SIZE;
if (remaining_size != 0)
{
fread(&buff, remaining_size, 1, inFp);
fwrite(&buff, remaining_size, 1, outFp);
}
for (i = 0; i < file_size / CHUNK_SIZE; ++i)
{
fread(&buff, CHUNK_SIZE, 1, inFp);
fwrite(&buff, CHUNK_SIZE, 1, outFp);
}
fclose(inFp);
inFp = NULL;
fclose(outFp);
outFp = NULL;
return 0;
}
#include
#include
#include
#include
#define CHUNK_SIZE 4096
#define HEADER_SIZE 12
int main(int argc, const char *argv[])
{
FILE *inFp = NULL;
FILE *outFp = NULL;
uint32_t read_temp_size;
char buff[CHUNK_SIZE];
char file_header[HEADER_SIZE];
uint32_t file_start_addr, file_size;
if (argc <= 1)
{
printf("no input file\n");
return 0;
}
char targetName[strlen(argv[1]) + 10];
strncpy(targetName, argv[1], strlen(argv[1]));
inFp = fopen(argv[1], "rb");
if (inFp == NULL)
{
printf("open file fail\n");
exit(1);
}
fseek(inFp, 20, SEEK_SET);
fread(&file_start_addr, 1, sizeof(file_start_addr), inFp);
printf("start:%d\n", file_start_addr);
fseek(inFp, 40, SEEK_SET);
fread(&file_size, 1, sizeof(file_size), inFp);
printf("end:%ld\n", file_size);
fseek(inFp, file_start_addr, SEEK_SET);
fread(&file_header, HEADER_SIZE, 1, inFp);
if ((file_header[0] == 0x49 && file_header[1] == 0x44 && file_header[2] == 0x33) || (file_header[0] == 0xFF && file_header[1] == 0xfb))
{
printf("MP3 file\n");
strcat(targetName, ".mp3");
}
else if ((file_header[4] == 0x66 && file_header[5] == 0x74 && file_header[6] == 0x79 && file_header[7] == 0x70 && file_header[8] == 0x4D && file_header[9] == 0x34 && file_header[10] == 0x41) || (file_header[0] == 0x4D && file_header[1] == 0x34 && file_header[2] == 0x41 && file_header[3] == 0x20))
{
printf("M4A file\n");
strcat(targetName, ".m4a");
}
else
{
printf("OTHER file\n");
strcat(targetName, ".temp");
}
outFp = fopen(targetName, "wb");
if (outFp == NULL)
{
printf("open file fail\n");
exit(1);
}
fseek(inFp, file_start_addr, SEEK_SET);
while (file_size != 0)
{
/* 使用右移和按位与优化代码 */
// read_temp_size = file_size / CHUNK_SIZE ? CHUNK_SIZE : file_size % CHUNK_SIZE;
read_temp_size = file_size >> 12 ? CHUNK_SIZE : file_size & (CHUNK_SIZE - 1);
fread(&buff, read_temp_size, 1, inFp);
fwrite(&buff, read_temp_size, 1, outFp);
file_size -= read_temp_size;
}
fclose(inFp);
inFp = NULL;
fclose(outFp);
outFp = NULL;
return 0;
}
猫儿转换器
https://474b.com/file/20114131-442366646
本文仅为个人学习使用,不得用于任何商业用途,否则后果自负!如侵犯到您的权益,请及时通知我,我会及时处理。