将原始音频写入文件?

时间:2014-08-07 15:15:22

标签: c audio libvlc libsndfile

我在C中为pocketsphinx freeswitch模块编写了一段代码,用于将话语(波形或音频)保存到文件中。我收到的音频为void *data及其unsigned int len,我必须将其另存为RAW(或PCM)文件(无标题)。 我该怎么做?

我试过这个:

FILE *_file;
int16_t *_data;
_data = (int16_t *) data;
_file=fopen("utterance","ab");
fwrite(data, sizeof(_data[0]), sizeof(_data)/sizeof(_data[0]), _file);
fclose(_file);
_file=NULL;

它不起作用(也许我做得不对劲?)。我还找到了libvlclibsndfile,但没有找到任何能够为我服务的功能。 这里的任何人都有一个简单的示例/教程吗?

我正在研究C,VS2010,Win8.1(x64)

3 个答案:

答案 0 :(得分:1)

当数据是指针时,你不应该使用sizeof(_data)/sizeof(_data[0]); sizeof(_data)是指针_data占用的字节数

size_t valueCount = sampleCount * channelCount;
FILE *_file;
int16_t *_data;
_data = (int16_t *) data;
_file=fopen("utterance","ab");
fwrite(data, sizeof(_data[0]), valueCount, _file);
fclose(_file);
_file=NULL;

您也可以使用

fwrite(data, 1, len, _file);

答案 1 :(得分:0)

这个问题的主要问题是你使用sizeof(_data) / sizeof(_data[0])来计算数组的长度。但是,由于_data的类型为int16_t *,即只是一个指针,因此sizeof(_data)将返回指针的大小(在您的情况下,仅为8)。您需要一些其他方法来传递数组的长度。

答案 2 :(得分:0)

sizeof应用于指针并不能告诉你有多少内存"它背后" (指针不知道它是指向一个孤独的东西,还是指向阵列的第一个元素)。
相反,它会告诉您指针的大小(以char为单位),这些指针通常为4或8天。

由于您知道数据的位置(data)及其数量(len),因此您无需投射或计算任何内容。

使用

fwrite(data, 1, len, _file);

fwrite(data, len, 1, _file);