gpt4 book ai didi

c - 将数据写入 wav 文件

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:55 26 4
gpt4 key购买 nike

我正在开发一个从 wav 文件中读取数据的小工具。该工具首先提取标题,然后将音频数据分成左右声道。音频文件就是采样频率为44100Hz、16Bit PCM、双声道的文件。

处理数据后,我想将数据写回输出文件并在每个 channel 上追加 100 个零。这里出现了问题:首先只有一半的所需样本被附加到每个 channel 上。其次,附加的“零”的前半部分是随机数据。

查看下面的代码

#include <stdlib.h>
#include <stdio.h>

#define BUFFSIZE 1024
#define NUM_ZEROS 100

#include <stdio.h>
#include <stdlib.h>

typedef struct header_file
{
char chunk_id[4];
int chunk_size;
char format[4];
char subchunk1_id[4];
int subchunk1_size;
short int audio_format;
short int num_channels;
int sample_rate;
int byte_rate;
short int block_align;
short int bits_per_sample;
char subchunk2_id[4];
int subchunk2_size;
} header;

typedef struct header_file* header_p;


int main(int argc, char** argv){

if( argc != 3 ){
printf("Wrong number of input arguments. Aborting.\n");
return -1;
}

char *inputFile = argv[1];
char *outputFile = argv[2];

FILE * infile = fopen(inputFile, "r+");
FILE * outfile = fopen(outputFile, "w+");

int count = 0; // For counting number of frames in wave file.
short int buff16[2*BUFFSIZE]; // short int used for 16 bit as input data format is 16 bit PCM audio
short int buffLeft[BUFFSIZE], buffRight[BUFFSIZE];
header_p meta = (header_p)malloc(sizeof(header)); // header_p points to a header struct that contains the wave file metadata fields
int nb, cnt; // variable storing number of bytes returned

printf("Buffers initialized.\n");

if (infile)
{
fread(meta, 1, sizeof(header), infile);
meta->subchunk2_size = meta->subchunk2_size + 2 * NUM_ZEROS;
fwrite(meta,1, sizeof(*meta), outfile);


while (!feof(infile))
{
nb = fread(buff16,1,BUFFSIZE,infile); // Reading data in chunks of BUFSIZE
count++; // Incrementing Number of frames

for(cnt = 0; cnt < nb/2; cnt++){
buffLeft[cnt] = buff16[2*cnt];
buffRight[cnt] = buff16[2*cnt+1];
}

/*
* TODO: INSERT SIGNAL PROCESSING PART
*/

for(cnt = 0; cnt < nb/2; cnt++){
buff16[2*cnt] = buffLeft[cnt];
buff16[2*cnt+1] = buffRight[cnt];
}

fwrite(buff16,1,nb,outfile);
}

for(cnt = 0; cnt < 2*NUM_ZEROS; cnt++){
buff16[cnt] = 0;
}
fwrite(buff16,1, 2*NUM_ZEROS,outfile);

printf("Number of frames in the input wave file are %d.\n", count);
}

fclose(infile);
fclose(outfile);

return 0;
}

有人知道我做错了什么吗?

最佳答案

你确定只有一部分添加的零是垃圾吗?

你弄乱了 freadfwrite 的数据大小

你的缓冲区是short int:

short int buff16[2*BUFFSIZE]; // BUFFSIZE*2*sizeof(short) bytes

您只阅读了该尺寸的 1/4:

nb = fread(buff16,1,BUFFSIZE,infile);  // BUFFSIZE bytes

这显示为 BUFSIZE bytes,因为您只为每个元素指定了 1 个大小。而不是 BUFFSIZE*2 短路,您只读取 BUFFSIZE 字节。返回值是读取元素的数量,即字节数。在您的缓冲区中,数据量仅够 nb/2 元素使用,但您访问 buff16[0] .. buff16[nb-1] 它的后半部分没有从文件中读取。幸运的是,您也没有将后半部分写回新文件,因为那里也存在与长度相同的错误。最后,当您将零值附加到文件时,会出现同样的问题。

tl;dr

freadfwrite 的大小参数更改为 sizeof(short int)

关于c - 将数据写入 wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41557990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com