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显然适用于浮点数,但您的缓冲区是双倍的 - 我认为您需要将缓冲区更改为浮点数并将sf_read_float/sf_write_float用于 I/O。

  • src_simple是“简单”界面,旨在一次调用中应用于整个波形,而不是像您所做的那样以块的形式应用-请参阅http://www.mega-nerd.com/SRC/faq.html#Q004-您应该首先获取输入文件的大小,然后分配足够的内存,读入整个文件,一次转换,然后将转换后的输出数据写入输出文件。

  • 更改采样率时,您将在输出文件中获得与输出文件中不同数量的样本(在这种情况下约为一半),但您正在写入与您读取的相同数量的样本(readcount)。您可能应该使用src_data.output_frames_gen作为要写入的帧数,而不是readcount.

于 2012-05-11T21:15:03.567 回答