将原始音频写入文件?
Posted
技术标签:
【中文标题】将原始音频写入文件?【英文标题】:Writing a raw audio to a file? 【发布时间】:2014-08-07 15:15:21 【问题描述】:我正在用 C 语言为 freeswitch
的 pocketsphinx
模块编写一段代码,以将话语(波形或音频)保存到文件中。我以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)
【问题讨论】:
【参考方案1】:当 _data 是一个指针时,你不应该使用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);
【讨论】:
我不敢相信我是怎么错过的。我使用了fwrite(data, 1, len, _file);
,它正在工作。非常感谢 Jake,快速准确的回复!【参考方案2】:
这样做的主要问题是您使用sizeof(_data) / sizeof(_data[0])
来尝试计算数组的长度。但是,由于_data
是int16_t *
类型,即只是一个指针,那么sizeof(_data)
将返回一个指针的大小(在您的情况下,它只是8)。你需要一些其他的方法来传递数组的长度。
【讨论】:
【参考方案3】:sizeof
应用于指针不会告诉您“背后”有多少内存(指针不知道它是指向一个孤独的东西,还是指向数组的第一个元素)。
相反,它会告诉您指针的大小(以char
s 为单位),现在通常为 4 或 8。
由于您知道数据在哪里 (data
) 以及有多少数据 (len
),因此您无需进行任何转换或计算。
使用任一
fwrite(data, 1, len, _file);
或
fwrite(data, len, 1, _file);
【讨论】:
以上是关于将原始音频写入文件?的主要内容,如果未能解决你的问题,请参考以下文章