【问题标题】: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)

【问题讨论】:

    标签: c audio libvlc libsndfile


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2017-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-12
        • 1970-01-01
        • 2015-11-07
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多