2015-06-04 1 views
0

Мне нужно удалить паузу в wav-файле (пауза - область с амплитудами < 16 и длина> N выборок). Не понимаю, как работать с образцами, и как читать образец по образцу из файла. Ниже мой код:Удалить паузы из wav-файла в C

#include <stdio.h> 
#include <stdlib.h> 
#define BUFSIZE 4000 

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 change_file(char * input, int N){ 
    FILE * infile = fopen(input, "rb"); 
    FILE * outfile = fopen("outfile.wav", "wb"); 
    short int inbuff16[BUFSIZE]; 
    header_p meta = (header_p)malloc(sizeof(header)); 

    if (infile) { 
     fread(meta, 1, sizeof(header), infile); 
     fwrite(meta, 1, sizeof(header), outfile); 

     while (!feof(infile)) { 
       fread(inbuff16, 1, BUFSIZE, infile);  
       //delete pause here 
       fwrite(inbuff16, 1, BUFSIZE, outfile); 
     } 
    } 
    if (infile) { fclose(infile); } 
    if (outfile) { fclose(outfile); } 
    if (meta) { free(meta); } 
} 

int main (int argc, char const *argv[]){ 
    char infile[] = "track.wav"; 
    change_file(infile, 20); 
    return 0; 
} 
+1

Вы можете рассчитывать «молчащие» образцы, а когда пауза обнаружена, установить положение выходного потока в начале паузы. Или вы можете прочитать весь файл в памяти и обработать его там. Последнее, вероятно, является лучшим подходом в целом. –

+0

Структура сообщает вам, насколько велики каждый образец и сколько их есть, но как * обрабатывать * образцы немного шире. Если я правильно помню, это в основном зависит от 'audio_format'; некоторые форматы хорошо документированы, некоторые - нет, некоторые могут обрабатываться простым кодом, а другие - не могут. – usr2564301

ответ