将原始音频写入文件?

Posted

技术标签:

【中文标题】将原始音频写入文件?【英文标题】:Writing a raw audio to a file? 【发布时间】:2014-08-07 15:15:21 【问题描述】:

我正在用 C 语言为 freeswitchpocketsphinx 模块编写一段代码,以将话语(波形或音频)保存到文件中。我以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)

【问题讨论】:

【参考方案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]) 来尝试计算数组的长度。但是,由于_dataint16_t * 类型,即只是一个指针,那么sizeof(_data) 将返回一个指针的大小(在您的情况下,它只是8)。你需要一些其他的方法来传递数组的长度。

【讨论】:

【参考方案3】:

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

由于您知道数据在哪里 (data) 以及有多少数据 (len),因此您无需进行任何转换或计算。

使用任一

fwrite(data, 1, len, _file);

fwrite(data, len, 1, _file);

【讨论】:

以上是关于将原始音频写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AUHAL 音频单元将字节写入音频文件

如何实时读取/写入原始音频数据(使用python)?

将浮点数组写入音频文件

如何使用 FFMPEG 和 C 将音频和视频写入同一个文件?

如何将音频效果应用于文件并写入文件系统 - iOS

Core Audio - 将数据写入音频文件的开头或中间(结尾以外的地方)