1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <assert.h> #include <sys/stat.h>
#pragma warning(disable:4996)
size_t getFileSize(const char* filename) { struct stat st; if (stat(filename, &st) != 0) { perror("无法获取文件大小"); exit(EXIT_FAILURE); } return st.st_size; }
int main(int argc, char* argv[]) { assert(argc == 3);
size_t bufferSize = getFileSize(argv[1]); uint8_t* bufferData = (uint8_t*)calloc(bufferSize, sizeof(uint8_t)); if (bufferData == NULL) { perror("内存分配失败"); return EXIT_FAILURE; }
FILE* ifs = fopen(argv[1], "rb"); if (ifs == NULL) { perror("无法打开输入文件"); free(bufferData); return EXIT_FAILURE; } fread(bufferData, sizeof(uint8_t), bufferSize, ifs); fclose(ifs);
uint8_t* buffer = (uint8_t*)calloc(bufferSize + 44, sizeof(uint8_t)); if (buffer == NULL) { perror("内存分配失败"); free(bufferData); return EXIT_FAILURE; }
const char ChunkID[4] = { 'R', 'I', 'F', 'F' }; const char Format[4] = { 'W', 'A', 'V', 'E' }; const char Subchunk1ID[4] = { 'f', 'm', 't', ' ' }; const char Subchunk2ID[4] = { 'd', 'a', 't', 'a' };
int32_t Subchunk1Size = 16; int16_t AudioFormat = 1; int16_t NumChannels = 1; int32_t SampleRate = 16000; int16_t BitsPerSample = 16; int32_t ByteRate = SampleRate * NumChannels * BitsPerSample / 8; int16_t BlockAlign = NumChannels * BitsPerSample / 8; int32_t Subchunk2Size = (int32_t)bufferSize; int32_t ChunkSize = 36 + Subchunk2Size;
memcpy(buffer, ChunkID, 4); memcpy(buffer + 4, &ChunkSize, 4); memcpy(buffer + 8, Format, 4); memcpy(buffer + 12, Subchunk1ID, 4); memcpy(buffer + 16, &Subchunk1Size, 4); memcpy(buffer + 20, &AudioFormat, 2); memcpy(buffer + 22, &NumChannels, 2); memcpy(buffer + 24, &SampleRate, 4); memcpy(buffer + 28, &ByteRate, 4); memcpy(buffer + 32, &BlockAlign, 2); memcpy(buffer + 34, &BitsPerSample, 2); memcpy(buffer + 36, Subchunk2ID, 4); memcpy(buffer + 40, &Subchunk2Size, 4);
memcpy(buffer + 44, bufferData, bufferSize);
FILE* ofs = fopen(argv[2], "wb"); if (ofs == NULL) { perror("无法打开输出文件"); free(bufferData); free(buffer); return EXIT_FAILURE; } fwrite(buffer, sizeof(uint8_t), bufferSize + 44, ofs); fclose(ofs);
free(bufferData); free(buffer);
return EXIT_SUCCESS; }
|