创建wav文件而不会耗尽ram

时间:2016-12-25 19:24:06

标签: c++ audio wav mbed

嗨我正试图从一块棋盘上录制,我已经成功录制了4秒。 问题是当我尝试记录更多时间时,我得到一个错误告诉我没有足够的内存。我的目标是记录一个5分钟的文件。 到目前为止,我已经创建了一个名为snIn [256]的缓冲区,其中包含样本。 我将它发送到[16K * 4sec]的大缓冲区,当它已满时,我创建了wav文件。

#define WAVFILE_SAMPLES_PER_SECOND 16000
#define REC_TIME 4

const int NUM_SAMPLES = WAVFILE_SAMPLES_PER_SECOND * REC_TIME;
Array<int16_t> my_buffer(NUM_SAMPLES);

int rec(const char *filename, Array<int16_t> my_buffer) {   

    WavFileResult result;
    wavfile_info_t info;
    wavfile_data_t data;

    // code for filling the info of the wav file: sample rate, byte rate , channels etc..

    WAVFILE *wf = wavfile_open(filename, WavFileModeWrite, &result);
    WAVFILE_DATA_NUM_CHANNELS(&data) = 1; rp = 0;
    wavfile_write_info(wf, &info);


    while ( rp < NUM_SAMPLES ) {
        WAVFILE_DATA_CHANNEL_DATA(&data, 0) = my_buffer[rp];//fill the data of the wav file       
        wavfile_write_data(wf, &data);
        rp += 1;
    }
    wavfile_close(wf);
    return 0;
}

void fill_buffer (Array<int16_t> snIn , int &j) {

        for (int i=0 ; i < SEG_SIZE ; i++) {
            my_buffer[j] = snIn[i]; //puts all the 256 values in my_buffer
            j++; }

            if (sent_array == ((int)NUM_SAMPLES/SEG_SIZE)){ // if my_buffer is full, go to rec and make a wav file
                rec (target_filename , my_buffer ); }
}

int main()
{
        Array<int16_t> snIn(256);

            for (int n=0; n<256 ; n++)
            { //snIn gets new 256 values }
        sent_array ++;
        fill_buffer (snIn , j);
}

我想到了一个可能的解决方案,直接填写&#34;数据字段&#34;一次又一次地使用snIn [256]缓冲区(而不是使用my_buffer)的波形文件,最后关闭wav文件。 请让我知道您对此以及其他解决方案的看法。

1 个答案:

答案 0 :(得分:0)

您的字节速率未正确计算。你需要遵循公式

num_channels * sample_rate * (bits_per_sample / 8)

此外,您尚未调用wavfile_write_info来编写元数据。 顺便说一句,你应该养成检查返回值的习惯。即

之类的东西
result = wavfile_write_data(wf, &data);
if (result != WavFileResultOK) {
    wavfile_result_string(result, res_buf, RES_STR_SIZE);
    printf("%s", res_buf);
    return result;
}

之前分配res_buf。你应该把它考虑在一个函数中。

这是完整的代码(我删除了嵌入的特定代码以在我的计算机上运行它):

    rp = 0;
    WAVFILE_DATA_NUM_CHANNELS(&data) = 1;
    while (rp<100) {
        WAVFILE_DATA_CHANNEL_DATA(&data, 0) = buffer[rp];
        result = wavfile_write_data(wf, &data);
        if (result != WavFileResultOK) {
            wavfile_result_string(result, res_buf, RES_STR_SIZE);
            printf("%s", res_buf);
            return result;
        }
        rp += 1;
    }
    result = wavfile_close(wf);
    if (result != WavFileResultOK) {
        wavfile_result_string(result, res_buf, RES_STR_SIZE);
        printf("%s", res_buf);
        return result;
    }
    printf("Success rec !\r\n");
    return 0;

}

int main(void)
{
    static const char *target_filename = "rectest.wav";
    for (int t=0 ; t<100 ; t++){
        buffer[t]= sin(2*3.14*t);
    }

    int res = rec(target_filename);
    if (res != 0) {
        return 1;
    }

    printf("success program!\r\n");
    return 0;
}
相关问题