将 .wav 文件转换为单声道(删除右声道)
Converting a .wav file to mono (delete right channel)
我正在尝试从 .wav 文件中删除正确的频道,但无济于事。原文的一些资料header:
NumChannels:2,BlockAlign:4,BitsPerSample:16
从这里我得到样本大小是 4 个字节(2Left + 2Right)所以我正在创建一个新文件,将原始 header 写入其中,然后一次写入 4 个字节到使用 AND 掩码 0xffff0000 将原始文件中的新文件归零右声道。尽管右声道的音量看起来确实降低了 90%,但我正在寻求一些改进。以下部分代码:
int convertToMono(char *original) {
Header *header = malloc(sizeof(Header));
getHeader(header, original);
FILE *fp = fopen(original, "rb");
fseek(fp, HEADER_SIZE, 0);// Advance HEADER_SIZE bytes to data section
// Create new file name
char *name = malloc((5 + strlen(original)) * sizeof(char));
strcpy(name, "new-");
strcat(name, original);
// Open new file and write the header to it
FILE *new = fopen(name, "wb");
fwrite(header, HEADER_SIZE, 1, new);
u_int sample = 0;// unsigned int, size in bytes == 4
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(u_int)) {
fread(&sample, sizeof(u_int), 1, fp);
sample = (sample & 0xffff0000);
fwrite(&sample, sizeof(u_int), 1, new);
}
fclose(fp);
fclose(new);
free(name);
return 0;
}
编辑:添加了 Audacity 显示的音频图片。
要转换为单声道,首先您必须更改与字段 numChannels 关联的 header 信息:
header->numChannels = 1;
header->subchunk2Size /= 2;
header->chunkSize = header->subchunk2Size + 36;
header->byteRate /= 2;
header->blockAlign /= 2;
然后你打开新文件,将修改后的header写入其中:
FILE *fp2 = fopen("new.wav", "wb");
fwrite(header, HEADER_SIZE, 1, fp2);
创建一个可以容纳两半样本的缓冲区:
size_t channel_size = (size_t) (header->bitsPerSample / 8);
char sample[channel_size];
对所有样本读写左声道,忽略右声道。
for (int i = 0; i < header->subchunk2Size; i += channel_size) {
fread(sample, channel_size, 1, fp1);
fwrite(sample, channel_size, 1, fp2);
fread(sample, channel_size, 1, fp1);
}
这将创建一个大小为原始文件一半的文件,并且只能听到左声道。注意:这并不意味着声音只会来自左耳机。
NumChannels:2,BlockAlign:4,BitsPerSample:16
从这里我得到样本大小是 4 个字节(2Left + 2Right)所以我正在创建一个新文件,将原始 header 写入其中,然后一次写入 4 个字节到使用 AND 掩码 0xffff0000 将原始文件中的新文件归零右声道。尽管右声道的音量看起来确实降低了 90%,但我正在寻求一些改进。以下部分代码:
int convertToMono(char *original) {
Header *header = malloc(sizeof(Header));
getHeader(header, original);
FILE *fp = fopen(original, "rb");
fseek(fp, HEADER_SIZE, 0);// Advance HEADER_SIZE bytes to data section
// Create new file name
char *name = malloc((5 + strlen(original)) * sizeof(char));
strcpy(name, "new-");
strcat(name, original);
// Open new file and write the header to it
FILE *new = fopen(name, "wb");
fwrite(header, HEADER_SIZE, 1, new);
u_int sample = 0;// unsigned int, size in bytes == 4
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(u_int)) {
fread(&sample, sizeof(u_int), 1, fp);
sample = (sample & 0xffff0000);
fwrite(&sample, sizeof(u_int), 1, new);
}
fclose(fp);
fclose(new);
free(name);
return 0;
}
编辑:添加了 Audacity 显示的音频图片。
要转换为单声道,首先您必须更改与字段 numChannels 关联的 header 信息:
header->numChannels = 1;
header->subchunk2Size /= 2;
header->chunkSize = header->subchunk2Size + 36;
header->byteRate /= 2;
header->blockAlign /= 2;
然后你打开新文件,将修改后的header写入其中:
FILE *fp2 = fopen("new.wav", "wb");
fwrite(header, HEADER_SIZE, 1, fp2);
创建一个可以容纳两半样本的缓冲区:
size_t channel_size = (size_t) (header->bitsPerSample / 8);
char sample[channel_size];
对所有样本读写左声道,忽略右声道。
for (int i = 0; i < header->subchunk2Size; i += channel_size) {
fread(sample, channel_size, 1, fp1);
fwrite(sample, channel_size, 1, fp2);
fread(sample, channel_size, 1, fp1);
}
这将创建一个大小为原始文件一半的文件,并且只能听到左声道。注意:这并不意味着声音只会来自左耳机。