嗨我正试图从一块棋盘上录制,我已经成功录制了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文件。 请让我知道您对此以及其他解决方案的看法。
答案 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;
}