从 ram 中创建没有 运行 的 wav 文件

create wav file without running out of ram

嗨,我正在尝试从板上记录,我已经成功记录了 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);
}

我想到了一个可能的解决方案,一次又一次地用snIn[256]缓冲区(而不是使用my_buffer)直接填充wavefile的"data field",最后关闭波形文件。 请让我知道您对此和其他解决方案的看法。

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

num_channels * sample_rate * (bits_per_sample / 8)

此外,您还没有调用 wavfile_write_info 来写入元数据。 顺便说一句,您应该养成检查 return 值的习惯。 IE。像

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;
}