2

libsndfile と libsamplerate を使用して、c で単純なサンプルレート コンバーターを構築しています。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;
}

それは本当に私にストレスを与え始めています。このプログラムは大学のプロジェクトであり、締め切りが迫っています。誰でも私を助けてもらえますか?

4

1 に答える 1

4

私はこの特定のライブラリの専門家ではありませんが、オンライン ドキュメントを見るだけで、コードにいくつかの問題があることがわかります。

  • src_simpleどうやらフロートで動作しますが、バッファーはダブルです-バッファーをフロートに変更し、I/O に / をsf_read_float使用する必要があると思います。sf_write_float

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

  • サンプル レートを変更すると、出力ファイルとは異なる数のサンプルが出力ファイルに取得されますが (この場合は約半分)、読み取ったのと同じ数のサンプルを書き込んでいます ( readcount)。src_data.output_frames_genではなく、おそらく書き込むフレーム数として使用する必要がありreadcountます。

于 2012-05-11T21:15:03.567 に答える