2012-05-11 5 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を明らかに山車と連携し、まだあなたのバッファが倍増しています - 浮動小数点型に変更する必要があると思いますが、sf_read_float/sf_write_floatをI/Oに使用してください。

  • src_simple「シンプル」のインターフェースであり、あなたがやっているように、1回の呼び出しでは、いないチャンクで波形全体に適用されることを意図している - http://www.mega-nerd.com/SRC/faq.html#Q004を参照してください - あなたは、最初に、十分なメモリを割り当て、その後、入力ファイルのサイズを取得する必要がありますファイル全体を読み込み、一度に変換して、変換した出力データを出力ファイルに書き込みます。

  • サンプルレートを変更すると、出力ファイルと出力ファイルのサンプル数が異なる場合があります(大文字と小文字の半分程度ですが、読んだサンプル数は同じです) readcount)。書き込むフレーム数はsrc_data.output_frames_genであるべきで、readcountではありません。

+0

私はちょうど1分前にdouble/floaterエラーを認識して修正しましたが、感謝しています。 1回の呼び出しで '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'の呼び出しで3番目のパラメータとして渡します)。 –

+0

私はそれを仲直りしましたが、私が正しいのかどうかは分かりません。私は今sf_write_float(outfile、dataout、src_data.output_frames_gen)を持っています。これにより、出力ファイルは非常に高速に再生され、長さは約10秒(元の1:47)になります。 – OliD

関連する問題