나는 wav 파일의 진폭을 처리하고 몇 가지 십진수로 스케일링을하고 있습니다. 나는 언어의 뉘앙스를 다루려고 노력하면서 메모리 효율적인 방법으로 파일을 읽고 다시 쓰는 방법에 대해 머리를 쓰려고 노력하고있다. (나는 C 언어에 익숙하지 않다.) 파일은 8 비트 또는 16 비트 형식 일 수 있습니다. 이 방법을 생각한 방법은 먼저 header data을 사전 정의 된 구조체로 읽고 버퍼에서 데이터 덩어리를 읽는 루프에서 실제 데이터를 처리하고 필요한 모든 작업을 수행 한 다음 그런 다음 출력에 기록하십시오. ,C와 오디오 wav 파일을 처리
#include <stdio.h>
#include <stdlib.h>
typedef struct header
{
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;
short int extra_param_size;
char subchunk2_id[4];
int subchunk2_size;
} header;
typedef struct header* header_p;
void scale_wav_file(char * input, float factor, int is_8bit)
{
FILE * infile = fopen(input, "rb");
FILE * outfile = fopen("outfile.wav", "wb");
int BUFSIZE = 4000, i, MAX_8BIT_AMP = 255, MAX_16BIT_AMP = 32678;
// used for processing 8-bit file
unsigned char inbuff8[BUFSIZE], outbuff8[BUFSIZE];
// used for processing 16-bit file
short int inbuff16[BUFSIZE], outbuff16[BUFSIZE];
// header_p points to a header struct that contains the file's metadata fields
header_p meta = (header_p)malloc(sizeof(header));
if (infile)
{
// read and write header data
fread(meta, 1, sizeof(header), infile);
fwrite(meta, 1, sizeof(meta), outfile);
while (!feof(infile))
{
if (is_8bit)
{
fread(inbuff8, 1, BUFSIZE, infile);
} else {
fread(inbuff16, 1, BUFSIZE, infile);
}
// scale amplitude for 8/16 bits
for (i=0; i < BUFSIZE; ++i)
{
if (is_8bit)
{
outbuff8[i] = factor * inbuff8[i];
if ((int)outbuff8[i] > MAX_8BIT_AMP)
{
outbuff8[i] = MAX_8BIT_AMP;
}
} else {
outbuff16[i] = factor * inbuff16[i];
if ((int)outbuff16[i] > MAX_16BIT_AMP)
{
outbuff16[i] = MAX_16BIT_AMP;
} else if ((int)outbuff16[i] < -MAX_16BIT_AMP) {
outbuff16[i] = -MAX_16BIT_AMP;
}
}
}
// write to output file for 8/16 bit
if (is_8bit)
{
fwrite(outbuff8, 1, BUFSIZE, outfile);
} else {
fwrite(outbuff16, 1, BUFSIZE, outfile);
}
}
}
// cleanup
if (infile) { fclose(infile); }
if (outfile) { fclose(outfile); }
if (meta) { free(meta); }
}
int main (int argc, char const *argv[])
{
char infile[] = "file.wav";
float factor = 0.5;
scale_wav_file(infile, factor, 0);
return 0;
}
나는 (A를 40Mb 파일, 1K 정도에 의해) 끝에서 다른 파일 크기를 받고 있어요, 나는 이것이 내가 출력에 전체 버퍼를 쓰고 있어요 때문이다 의심 전체 버퍼 크기를 채우기 전에 파일이 종료되었을 수 있습니다. 또한 출력 파일이 엉망입니다 - 재생 또는 열리지 않습니다 - 그래서 나는 아마 모든 일을 잘못하고 있어요. 내가 엉망이되고있는 곳의 어떤 조언도 위대 할 것이다. 감사!
는 입력 및 출력 파일은 다른이 크기는 출력 파일이 입력보다 크거나 작습니까? – bta
출력이 더 크다 – sa125