创建wav文件,而不会用完ram
问题描述:
嗨,我正在尝试从电路板进行记录,并且我已成功记录4秒。 问题是当我尝试记录更多时间时,我得到一个错误,告诉我没有足够的内存。我的目标是记录一个5分钟的文件。 直到现在我已经创建了一个名为snIn [256]的缓冲区,其中是样本。 我把它发送到[16K * 4sec]的大缓冲区,当它已满时,我创建wav文件。创建wav文件,而不会用完ram
#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的“数据区”,并在端部关闭wavfile。 请让我知道您对此和其他解决方案的看法。
答
您的字节速率计算不正确。您需要按照公式
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;
}
欢迎堆栈溢出。请花些时间阅读[The Tour](http://*.com/tour),并参阅[帮助中心](http://*.com/help/asking)中的资料,了解您可以在这里问。 –
解决这些问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://*.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –
问题是,我无法找到我使用的编译器中的任何调试器。就像我写的,我编程mbed.org在线编译器,这是非常简单的... – gab55