原创文|Space9
猫耳FM音频与普通音频的差异
首先我们发现猫耳FM音频是没有后缀名的音频文件,然后我们通过对比发现猫耳FM音频文件并不是什么加密文件,只是将音频文件、封面图片、弹幕文件合并到了一起(导致其他音频播放器无法识别音频)。
如何分离中间部分的音频文件
我们要分离中间部分的音频文件需要获得以下两个信息(文件的开头和结尾)。
猫耳FM的文件头探究
- 第21-24字节 0014H 0015H 0016H 0017H(4字节)是使用小端存储的开始地址
- 第41-44字节 0028H 0029H 0030H 0031H(4字节)是使用小端存储的结束地址
源码
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#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(<