我在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;
它不起作用(也许我做得不对劲?)。我还找到了libvlc
和libsndfile
,但没有找到任何能够为我服务的功能。
这里的任何人都有一个简单的示例/教程吗?
我正在研究C,VS2010,Win8.1(x64)
答案 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);