首页 > 编程知识 正文

猫耳fm里的音频怎么转换成mp3格式,猫耳fm的音频怎么转换成mp3

时间:2023-05-04 03:21:03 阅读:247699 作者:2439

原创文|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 12int 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 filen");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 failn");exit(1);}fseek(inFp, 20, SEEK_SET);fread(&file_start_addr, 1, sizeof(file_start_addr), inFp);printf("start:%dn", file_start_addr);fseek(inFp, 40, SEEK_SET);fread(&file_size, 1, sizeof(file_size), inFp);printf("end:%ldn", 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 filen");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 filen");strcat(targetName, ".m4a");}else{printf("OTHER filen");strcat(targetName, ".temp");}outFp = fopen(targetName, "wb");if (outFp == NULL){printf("open file failn");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 <stdio.h>#include <stdint.h>#include <stdlib.h>#include <string.h>#define CHUNK_SIZE 4096#define HEADER_SIZE 12int 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 filen");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 failn");exit(1);}fseek(inFp, 20, SEEK_SET);fread(&file_start_addr, 1, sizeof(file_start_addr), inFp);printf("start:%dn", file_start_addr);fseek(inFp, 40, SEEK_SET);fread(&file_size, 1, sizeof(file_size), inFp);printf("end:%ldn", 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 filen");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 filen");strcat(targetName, ".m4a");}else{printf("OTHER filen");strcat(targetName, ".temp");}outFp = fopen(targetName, "wb");if (outFp == NULL){printf("open file failn");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;} 实现DEMO

猫儿转换器 WIN端

https://474b.com/file/20114131-442366646

猫儿转换器 MAC端

https://n802.com/file/20114131-463229588

本文仅为个人学习使用,不得用于任何商业用途,否则后果自负!如侵犯到您的权益,请及时通知我,我会及时处理。

Git-查找回购中哪些应用已更改ULB服务器是否会宕机? 负载均衡 ULB

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。