wav파일 속도2배속하는 코드 질문합니다!

kart의 이미지

안녕하세요 wav파일의 속도를2배빠르게 하는 코드를 작성하고 싶은데요

일단 코드에서

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
 
typedef unsigned short    uint16_t; 
typedef unsigned int    uint32_t; 
typedef int                int16_t; 
typedef unsigned char    byte; 
 
typedef struct { 
    char     chunk_id[4]; 
    uint32_t chunk_size;  
    char     format[4]; 
    char     fmtchunk_id[4]; 
    uint32_t fmtchunk_size; 
    uint16_t audio_format; 
    uint16_t num_channels; 
    uint32_t sample_rate;  
    uint32_t byte_rate;  
    uint16_t block_align; 
    uint16_t bps; 
    char     datachunk_id[4];  
 
    uint32_t datachunk_size; 
 }WavHeader;  
 
 int total_file_len = 0;
 
 void wav_read(char * file_name, WavHeader * header, byte ** real_data) 
 { 
    FILE * fp; 
    int len; 
    fp = fopen(file_name, "rb"); 
    len = fread(header, 1, sizeof(WavHeader), fp); 
    total_file_len += len; 
 
    (*real_data) = (byte *)malloc(header->datachunk_size); 
    len = fread(*real_data, 1, header->datachunk_size, fp);  
    total_file_len += len; 
    fclose(fp); 
 } 
 
 void wav_write(char * file_name, WavHeader * header, byte * real_data) 
 { 
    FILE * fp; 
    header->datachunk_size /= 2; 
    fp = fopen(file_name, "wb"); 
    fwrite(header, sizeof(WavHeader), 1, fp); 
    byte *r = (byte *)malloc(header->datachunk_size); // 
    for(int i = 0; i< header->datachunk_size; i++) // 
    { 
       *(r+i) = *(real_data + 2*i);  //이부분!! 
    } 
    fwrite(r,header->datachunk_size , 1, fp); 
    free(r); 
    fclose(fp);    
 } 
 
 int main() 
 { 
    WavHeader header; //헤더 
    byte * real_data; //소리데이터 
    wav_read("a.wav", &header, &real_data); 
    wav_write("write.wav", &header, real_data); 
    free(real_data); 
    return 0; 
 
 } 

주석 친 부분보시면 일단 r이라는 공간할당하고 거기에 wav_read에서 소리데이터를 할당한 read_data의 정보를 read_data[0],read_data[2],read_data[4]이런식으로 할당하여 2배속을 하는 방법을 사용하였습니다. 그런데 컴파일해보니 노래는안나오고 치지직하는 소리만들리더군요. 왜 안되는 거고 어떻게 수정해야하는지요ㅠㅠ

gilgil의 이미지

format이 8bit인 경우에는 바이트 단위로 잘라서 처리해야 하고
format이 16bit인 경우에는 2바이트 단위로 잘라서 처리해야 겠죠.

kart의 이미지

감사합니다~

shint의 이미지


되기는 하는데. 정확한지는 잘 모르겠습니다.

사운드 프로그래밍 관련 책을 보시기를 추천드립니다.

녹음 이라기보다는 wav 파일을 wav 2배속 파일로 복사하는 프로그램입니다.

자세한 사항은 파일로 첨부합니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon test wav파일 2배속 녹음하기.zip1.64 MB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

kart의 이미지

아아 read_data를 2곱하는게아니라 r을 2로나눠야 하는군요.. 왜안되나 계속고민하고있었는데 큰 도움이 되었습니다. 감사합니다!