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