1

我正在用 C 语言编写一段代码,用于pocketsphinxfreeswitch话语(波形或音频)保存到文件中。void *data我以 a和它的形式接收音频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)

4

3 回答 3

1

sizeof(_data)/sizeof(_data[0])当 _data 是指针时,您不应该使用;是指针占用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);
于 2014-08-07T15:26:44.683 回答
0

sizeof应用于指针并不能告诉您“在它后面”有多少内存(指针不知道它是指向一个孤独的东西,还是指向数组的第一个元素)。
相反,它会告诉您指针的大小(以chars 为单位),如今通常为 4 或 8。

因为您知道数据在哪里 ( data) 以及它有多少 ( len),所以您不需要转换或计算任何东西。

使用任一

fwrite(data, 1, len, _file);

或者

fwrite(data, len, 1, _file);
于 2014-08-07T16:48:58.790 回答
0

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

于 2014-08-07T15:19:35.817 回答