2012-05-11 2 views
1

libsndfile 및 libsamplerate를 사용하여 간단한 샘플러 변환기를 c로 작성했습니다. 난 그냥 libsamplerate의 src_simple 함수를 얻는 것 같다. 나는 무엇이든 시도한다. 나는 가능한 한 단순하게 내 코드를 다시 스트라이프하고 지금은 단지 동일한 샘플링 속도의 자동 오디오 파일을 출력합니다libsndfile 및 libsamplerate를 사용하는 오디오 샘플러 변환기. 함수 src_simple을 올바르게 사용하고 있는지 확실하지 않음

#include <stdio.h> 
#include <sndfile.h> 
#include <samplerate.h> 

#define BUFFER_LEN 1024 
#define MAX_CHANNELS 6 

int main() 
{ 
    static double datain [BUFFER_LEN]; 
    static double dataout [BUFFER_LEN]; 
    SNDFILE *infile, *outfile; 
    SF_INFO  sfinfo, sfinfo2 ; 
    int   readcount ; 
    const char *infilename = "C:/Users/Oli/Desktop/MARTYTHM.wav" ; 
    const char *outfilename = "C:/Users/Oli/Desktop/Done.wav" ; 
    SRC_DATA src_data; 

    infile = sf_open (infilename, SFM_READ, &sfinfo); 
    outfile = sf_open (outfilename, SFM_WRITE, &sfinfo); 

    src_data.data_in = datain 
    src_data.input_frames = BUFFER_LEN; 
    src_data.data_out = dataout; 
    src_data.output_frames = BUFFER_LEN; 
    src_data.src_ratio = 0.5; 

    src_simple (&src_data, SRC_SINC_BEST_QUALITY, 1); 

    while ((readcount = sf_read_double (infile, datain, BUFFER_LEN))) 
    { 
     src_simple (&src_data, SRC_SINC_BEST_QUALITY, 1); 
     sf_write_double (outfile, dataout, readcount) ; 
    }; 

    sf_close (infile); 
    sf_close (outfile); 

    sf_open ("C:/Users/Oli/Desktop/Done.wav", SFM_READ, &sfinfo2); 

    printf("%d", sfinfo2.samplerate); 

    return 0; 
} 

정말 저를 강조하기 시작합니다. 이 프로그램은 하나의 프로젝트이며 곧 시행 될 예정입니다. 시도하는 것이 무엇이든 실패로 끝나는 것처럼 그것은 매우 불안합니다. 아무도 나를 도울 수 있습니까?

+1

왜 이전 질문을 삭제하고 다시 게시 했습니까? 이제 답변과 의견을 잃어 버렸습니다. –

+0

죄송합니다 본질적으로 새로운 스레드를 만들어야하는 다른 프로그램이기 때문에 나는 생각했습니다. – OliD

+0

정말 새로운 질문이 있으시면 언제든지 게시 하시겠지만 이전 답변은 삭제하지 마십시오. 응답이 다른 사람들에게 유용 할 수 있습니다. 그래도 원본 질문에 추가 정보를 추가하려는 경우 편집하십시오. –

답변

3

나는이 특정 라이브러리에 있지만, 그냥 코드에 몇 가지 문제를 참조 online documentation보고에서 전문가가 아니에요 :

  • src_simple 분명히 수레와 함께 작동, 아직 버퍼는 두 배로 있습니다 - float에 버퍼를 변경하고 I/O에 sf_read_float/sf_write_float을 사용해야한다고 생각합니다. http://www.mega-nerd.com/SRC/faq.html#Q004를 참조 - - 먼저 입력 파일 크기를 받아야하고 충분한 메모리를 할당

  • src_simple

    는 "간단한"인터페이스가 아니라 당신이하고있는 것처럼 덩어리, 하나의 호출에 전체 파형에 적용하기위한 것입니다 전체 파일을 읽고 한 번에 변환 한 다음 변환 된 출력 데이터를 출력 파일에 씁니다.

  • 샘플 속도를 변경하면 출력 파일에 출력되는 파일의 수와 다른 수의 샘플이 생성되지만 (이 경우에는 절반 정도), 읽은 샘플의 수와 동일한 수의 샘플을 작성합니다 readcount). 쓸 프레임 수는 src_data.output_frames_gen이어야하며, readcount이 아닙니다.

+0

감사합니다. 방금 전에 double/floater 오류가 발생하여이를 해결했지만 고마워했습니다. 한 번의 호출로 'src_simple'을 어떻게 적용합니까? 내가 덩어리로 할 필요가 있는지 확신 할 수 없다. 'src_data.output_frames = BUFFER_LEN;'을 (를) 변경해야합니까? ? 샘플 수를 어떻게 계산합니까? 도움 주셔서 감사합니다. – OliD

+0

http://www.mega-nerd.com/SRC/api_simple.html *을주의 깊게 다시 읽으십시오 - 생성 된 샘플의 수는'src_data.output_frames_gen'에 반환됩니다 -이 샘플을 당신에게 쓸 샘플의 수로 사용하십시오 출력 파일 (즉,'sf_write_float' 호출에서 세 번째 매개 변수로 전달). –

+0

좋아, 나는 친하게 지냈어.하지만 내가 제대로했는지 모르겠다. 이제 sf_write_float (outfile, dataout, src_data.output_frames_gen); 이로 인해 출력 된 파일이 매우 빨리 재생되고 길이가 약 10 초 (원본 1:47)가됩니다. – OliD